[
  {
    "path": ".gitignore",
    "content": "*.pyc\n# don't include third-party dependencies.\n!lib/README.md\n.DS_Store\n"
  },
  {
    "path": ".playground",
    "content": "{\n  \"template_name\" : \"Flask web framework\",\n  \"template_description\" : \"Skeleton app based on Flask microframework (http://flask.pocoo.org/)\",\n  \"open_files\": [\"main.py\"]\n}\n"
  },
  {
    "path": "CONTRIB.md",
    "content": "# How to become a contributor and submit your own code\n\n## Contributor License Agreements\n\nWe'd love to accept your sample apps and patches! Before we can take them, we have to jump a couple of legal hurdles.\n\nPlease fill out either the individual or corporate Contributor License Agreement (CLA).\n\n  * If you are an individual writing original source code and you're sure you own the intellectual property, then you'll need to sign an [individual CLA](http://code.google.com/legal/individual-cla-v1.0.html).\n  * If you work for a company that wants to allow you to contribute your work, then you'll need to sign a [corporate CLA](http://code.google.com/legal/corporate-cla-v1.0.html).\n\nFollow either of the two links above to access the appropriate CLA and instructions for how to sign and return it. Once we receive it, we'll be able to accept your pull requests.\n\n## Contributing A Patch\n\n1. Submit an issue describing your proposed change to the repo in question.\n1. The repo owner will respond to your issue promptly.\n1. If your proposed change is accepted, and you haven't already done so, sign a Contributor License Agreement (see details above).\n1. Fork the desired repo, develop and test your code changes.\n1. Ensure that your code adheres to the existing style in the sample to which you are contributing. Refer to the [Google Cloud Platform Samples Style Guide](https://github.com/GoogleCloudPlatform/Template/wiki/style.html) for the recommended coding standards for this organization.\n1. Ensure that your code has an appropriate set of unit tests which all pass.\n1. Submit a pull request.\n\n## Contributing A New Sample App\n\n1. Submit an issue to the GoogleCloudPlatform/Template repo describing your proposed sample app.\n1. The Template repo owner will respond to your enhancement issue promptly. Instructional value is the top priority when evaluating new app proposals for this collection of repos.\n1. If your proposal is accepted, and you haven't already done so, sign a Contributor License Agreement (see details above).\n1. Create your own repo for your app following this naming convention:\n    * {product}-{app-name}-{language}\n    * products: appengine, compute, storage, bigquery, prediction, cloudsql\n    * example:  appengine-guestbook-python\n    * For multi-product apps, concatenate the primary products, like this: compute-appengine-demo-suite-python.\n    * For multi-language apps, concatenate the primary languages like this: appengine-sockets-python-java-go.\n1. Clone the README.md, CONTRIB.md and LICENSE files from the GoogleCloudPlatform/Template repo.\n1. Ensure that your code adheres to the existing style in the sample to which you are contributing. Refer to the [Google Cloud Platform Samples Style Guide](https://github.com/GoogleCloudPlatform/Template/wiki/style.html) for the recommended coding standards for this organization.\n1. Ensure that your code has an appropriate set of unit tests which all pass.\n1. Submit a request to fork your repo in GoogleCloudPlatform organizationt via your proposal issue.\n"
  },
  {
    "path": "LICENSE",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\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"
  },
  {
    "path": "README.md",
    "content": "![status: inactive](https://img.shields.io/badge/status-inactive-red.svg)\n\nThis project is no longer actively developed or maintained.\n\nFor new work on this check out [flask Hello World](https://github.com/GoogleCloudPlatform/python-docs-samples/tree/master/appengine/standard/flask/hello_world).\n\n\n## Python Flask Skeleton for Google App Engine\n\nA skeleton for building Python applications on Google App Engine with the\n[Flask micro framework](http://flask.pocoo.org).\n\nSee our other [Google Cloud Platform github\nrepos](https://github.com/GoogleCloudPlatform) for sample applications and\nscaffolding for other python frameworks and use cases.\n\n## Run Locally\n1. Install the [App Engine Python SDK](https://developers.google.com/appengine/downloads).\nSee the README file for directions. You'll need python 2.7 and [pip 1.4 or later](http://www.pip-installer.org/en/latest/installing.html) installed too.\n\n2. Clone this repo with\n\n   ```\n   git clone https://github.com/GoogleCloudPlatform/appengine-flask-skeleton.git\n   ```\n3. Install dependencies in the project's lib directory.\n   Note: App Engine can only import libraries from inside your project directory.\n\n   ```\n   cd appengine-flask-skeleton\n   pip install -r requirements.txt -t lib\n   ```\n4. Run this project locally from the command line:\n\n   ```\n   dev_appserver.py .\n   ```\n\nVisit the application [http://localhost:8080](http://localhost:8080)\n\nSee [the development server documentation](https://developers.google.com/appengine/docs/python/tools/devserver)\nfor options when running dev_appserver.\n\n## Deploy\nTo deploy the application:\n\n1. Use the [Admin Console](https://appengine.google.com) to create a\n   project/app id. (App id and project id are identical)\n1. [Deploy the\n   application](https://developers.google.com/appengine/docs/python/tools/uploadinganapp) with\n\n   ```\n   appcfg.py update -A <your-project-id> -V v1 .\n   ```\n   \n   If this isn't your first deployment, you will need to set the new version as the default version with\n   \n   ```\n   appcfg.py set_default_version -V v1 -A <your-project-id>\n   ```\n\n1. Congratulations!  Your application is now live at your-app-id.appspot.com\n\n## Next Steps\nThis skeleton includes `TODO` markers to help you find basic areas you will want\nto customize.\n\n### Relational Databases and Datastore\nTo add persistence to your models, use\n[NDB](https://developers.google.com/appengine/docs/python/ndb/) for\nscale.  Consider\n[CloudSQL](https://developers.google.com/appengine/docs/python/cloud-sql)\nif you need a relational database.\n\n### Installing Libraries\nSee the [Third party\nlibraries](https://developers.google.com/appengine/docs/python/tools/libraries27)\npage for libraries that are already included in the SDK.  To include SDK\nlibraries, add them in your app.yaml file. Other than libraries included in\nthe SDK, only pure python libraries may be added to an App Engine project.\n\n### Feedback\nStar this repo if you found it useful. Use the github issue tracker to give\nfeedback on this repo.\n\n## Contributing changes\nSee [CONTRIB.md](CONTRIB.md)\n\n## Licensing\nSee [LICENSE](LICENSE)\n\n## Author\nLogan Henriquez and Johan Euphrosine\n"
  },
  {
    "path": "app.yaml",
    "content": "# This file specifies your Python application's runtime configuration\n# including URL routing, versions, static file uploads, etc. See\n# https://developers.google.com/appengine/docs/python/config/appconfig\n# for details.\n\nruntime: python27\napi_version: 1\nthreadsafe: yes\n\n# Handlers define how to route requests to your application.\nhandlers:\n\n# App Engine serves and caches static files contained in the listed directories\n# (and subdirectories). Uncomment and set the directory as needed.\n#- url: /client\n#  static_dir: client\n\n# This handler tells app engine how to route requests to a WSGI application.\n# The script value is in the format <path.to.module>.<wsgi_application>\n# where <wsgi_application> is a WSGI application object.\n- url: .*  # This regex directs all routes to main.app\n  script: main.app\n\n# Third party libraries that are included in the App Engine SDK must be listed\n# here if you want to use them.  See\n# https://developers.google.com/appengine/docs/python/tools/libraries27 for\n# a list of libraries included in the SDK.  Third party libs that are *not* part\n# of the App Engine SDK don't need to be listed here, instead add them to your\n# project directory, either as a git submodule or as a plain subdirectory.\n# TODO: List any other App Engine SDK libs you may need here.\n#libraries:\n#- name: jinja2\n#  version: latest\n"
  },
  {
    "path": "appengine_config.py",
    "content": "\"\"\"\n`appengine_config.py` is automatically loaded when Google App Engine\nstarts a new instance of your application. This runs before any\nWSGI applications specified in app.yaml are loaded.\n\"\"\"\n\nfrom google.appengine.ext import vendor\n\n# Third-party libraries are stored in \"lib\", vendoring will make\n# sure that they are importable by the application.\nvendor.add('lib')\n"
  },
  {
    "path": "lib/Flask-0.10.dist-info/DESCRIPTION.rst",
    "content": "Flask\n-----\n\nFlask is a microframework for Python based on Werkzeug, Jinja 2 and good\nintentions. And before you ask: It's BSD licensed!\n\nFlask is Fun\n````````````\n\n.. code:: python\n\n    from flask import Flask\n    app = Flask(__name__)\n\n    @app.route(\"/\")\n    def hello():\n        return \"Hello World!\"\n\n    if __name__ == \"__main__\":\n        app.run()\n\nAnd Easy to Setup\n`````````````````\n\n.. code:: bash\n\n    $ pip install Flask\n    $ python hello.py\n     * Running on http://localhost:5000/\n\nLinks\n`````\n\n* `website <http://flask.pocoo.org/>`_\n* `documentation <http://flask.pocoo.org/docs/>`_\n* `development version\n  <http://github.com/mitsuhiko/flask/zipball/master#egg=Flask-dev>`_\n\n\n\n"
  },
  {
    "path": "lib/Flask-0.10.dist-info/METADATA",
    "content": "Metadata-Version: 2.0\nName: Flask\nVersion: 0.10\nSummary: A microframework based on Werkzeug, Jinja2 and good intentions\nHome-page: http://github.com/mitsuhiko/flask/\nAuthor: Armin Ronacher\nAuthor-email: armin.ronacher@active-4.com\nLicense: BSD\nPlatform: any\nClassifier: Development Status :: 4 - Beta\nClassifier: Environment :: Web Environment\nClassifier: Intended Audience :: Developers\nClassifier: License :: OSI Approved :: BSD License\nClassifier: Operating System :: OS Independent\nClassifier: Programming Language :: Python\nClassifier: Programming Language :: Python :: 2.6\nClassifier: Programming Language :: Python :: 2.7\nClassifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content\nClassifier: Topic :: Software Development :: Libraries :: Python Modules\nRequires-Dist: Werkzeug (>=0.7)\nRequires-Dist: Jinja2 (>=2.4)\nRequires-Dist: itsdangerous (>=0.21)\n\nFlask\n-----\n\nFlask is a microframework for Python based on Werkzeug, Jinja 2 and good\nintentions. And before you ask: It's BSD licensed!\n\nFlask is Fun\n````````````\n\n.. code:: python\n\n    from flask import Flask\n    app = Flask(__name__)\n\n    @app.route(\"/\")\n    def hello():\n        return \"Hello World!\"\n\n    if __name__ == \"__main__\":\n        app.run()\n\nAnd Easy to Setup\n`````````````````\n\n.. code:: bash\n\n    $ pip install Flask\n    $ python hello.py\n     * Running on http://localhost:5000/\n\nLinks\n`````\n\n* `website <http://flask.pocoo.org/>`_\n* `documentation <http://flask.pocoo.org/docs/>`_\n* `development version\n  <http://github.com/mitsuhiko/flask/zipball/master#egg=Flask-dev>`_\n\n\n\n"
  },
  {
    "path": "lib/Flask-0.10.dist-info/RECORD",
    "content": "flask/__init__.py,sha256=Hmok7MXSW0QTF-6TCFPfRqpHlVq1zOihqSMnHfXysvo,1672\r\nflask/_compat.py,sha256=ug9fCmzhMFE1ecCpZLvbHSTXluYCcLXt3_8SNwGNZyg,2164\r\nflask/app.py,sha256=U7K6oLEhv59ZrIJEzfVfVcB33PYKRQQN2CYLalOaNSA,76786\r\nflask/blueprints.py,sha256=OBo5Mkl_y54l0xPuLptXz54CDvvRX5tApMKIXyvykTk,16320\r\nflask/config.py,sha256=NhTkQX2yFgPDZD-t3phxcS2kw6i2kA7RHgX0fDoHXbQ,6234\r\nflask/ctx.py,sha256=Ka_Ql-ZgRU7z9aVkET0_WwwTKguaUozg3ezDcm-tUKY,14266\r\nflask/debughelpers.py,sha256=iyJC--eX8ANvci4MsFbtwc_PkwVlbCrZGHCOnQsOHFs,3508\r\nflask/exthook.py,sha256=dfW3DBBI8LyPrwacwZN8q0u0Q8gBBCXtocJ7wBnvgAs,5087\r\nflask/globals.py,sha256=kNGf5b05C8AjTzZJhBUbbtgufgumOnAPk9g_LYh0Rv0,1137\r\nflask/helpers.py,sha256=roTv_nwOjhAhUWvW-Uz_Ex9SLA32mEx_7vfZagZjizA,33793\r\nflask/json.py,sha256=qPIc18Pd2jj3EDJMan1BmkYxhJKYKpBw4oPp8Z6b2uo,7530\r\nflask/logging.py,sha256=EkiNIJbQyeUb8nipAURO8CQJwC4BESjkM_snQIRCeIc,1398\r\nflask/module.py,sha256=2J_pmW7jaFye1FtNTn5jfX-HxBqMc9EZzSLUXxiV-7c,1363\r\nflask/sessions.py,sha256=X0yDRq4cpKluFlDupBDFAouQxJWP09sSES8pKnXpcPg,12882\r\nflask/signals.py,sha256=DmcQfKzlPdLoY00fxf2BsH3SsDFiFSppCbX9Yfdv_ng,2140\r\nflask/templating.py,sha256=joMsvkTasZUJxdipA0BnrbfIMidzzBzPug-dIaW0Tzo,4707\r\nflask/testing.py,sha256=C8b-44Ro9hsFH5-eBksgjBWLrPznESmX9rdMFBkIbp4,5003\r\nflask/views.py,sha256=S2fRXcRsyy6FUKJ9tZh39LLH22vOeZvYMLZQKT1pc6Y,5642\r\nflask/wrappers.py,sha256=67pssdNN3I4dKSVUVru5HNUteAeF2V6_7qpLZoVwmiI,6709\r\nflask/ext/__init__.py,sha256=M97BrvCtJFgcWpt8Jo1qg2nLkQaGd-4whLkdHfi-rE8,842\r\nflask/testsuite/__init__.py,sha256=zCtem4AVtj6_GSTxCFUHElbH3g6LYY9ApIr7NVUWmGU,7022\r\nflask/testsuite/appctx.py,sha256=vt0c0gfqcUYXfJ7t2IRd3Gg0BzSaLKO2bx9d5Id7m6M,3116\r\nflask/testsuite/basic.py,sha256=EX66aNjBKOt5I8PWcpstzTCsy2O1M29kSDxAwLeySPg,42765\r\nflask/testsuite/blueprints.py,sha256=uLsqDu1AyTPeQJ6Ab1RHKPcYbo5s-7adSW5XSE1Fa0o,28089\r\nflask/testsuite/config.py,sha256=h64-JdPdlU6a7O8YfwAEriYZ30yAD1c_vjjYgyJ-JzA,11820\r\nflask/testsuite/deprecations.py,sha256=tsvmOrjcG1tV6vV4ySL5a7V4o77Tnf4wd_-yqVhUXIc,511\r\nflask/testsuite/examples.py,sha256=KyCnXuKNFfBEAyPl12a-etPF_PRufrJGwP09zTvl714,942\r\nflask/testsuite/ext.py,sha256=5jOofZijgqi5OmRV7YxB7RS-RY7HuSj3L90316yH_IY,5156\r\nflask/testsuite/helpers.py,sha256=nSZ1xuJeOJWcK6_wSv_L3tl8OAe_zcaRT_IoPpZPcvg,21657\r\nflask/testsuite/regression.py,sha256=QDMe2hkgu3lV8RaUhHsICciKWhSC6L2TaYe9qITlyL8,3198\r\nflask/testsuite/reqctx.py,sha256=EriP7GP23zt3zWKabTvEzldvp0EqRe--v8W-ZKwCz9k,5960\r\nflask/testsuite/signals.py,sha256=jclEzgHqRhPgM3uoxRbgmXIiFm_HWlrkqT5M0hBv5xw,4807\r\nflask/testsuite/subclassing.py,sha256=TT-nltJBy1Xi1BxcdztGZ3hmMq9h_nk1CVeSy9qBrXQ,1214\r\nflask/testsuite/templating.py,sha256=2lg2-MPMGkmlKap9M711uVXC08iZU8w3EtmTI2la_N8,11237\r\nflask/testsuite/testing.py,sha256=ihNMpcAxZ3wArSjUvFuCaHSREgjQNV5UAS2W1vYSNt4,7411\r\nflask/testsuite/views.py,sha256=2ThDMtk1zoMvuXzRuP1Wh3e_hgDwPtyu76TXycVyhqc,5068\r\nflask/testsuite/static/index.html,sha256=f28C_muYEAWoHyfaubxti-TLB0wMjFZHII3e9TRsmsI,22\r\nflask/testsuite/templates/_macro.html,sha256=XA2qnwpJpO3auSjZlKXODzeU4Fcnim12ie5lMXeL8ms,55\r\nflask/testsuite/templates/context_template.html,sha256=hXvHzdggsqqO2eXRlb6EhGDTTzPIQicaMk2EibzagDQ,36\r\nflask/testsuite/templates/escaping_template.html,sha256=ORPM3QIOIu_lWv9M101bPHZt-bmy8Biu2663aAoO50g,147\r\nflask/testsuite/templates/mail.txt,sha256=8f9j1PxUo_deGbrpJuDdrii16qE-xtV9RU6mYPVE_64,14\r\nflask/testsuite/templates/simple_template.html,sha256=d0akkxWQ1UQkDiL45b8nUvCE0KpL579DhioYlv713bE,23\r\nflask/testsuite/templates/template_filter.html,sha256=ZIk3H4Oa8fDn62Ij6jDzdHukLj3RXGtmBnkEtgTUmQ0,25\r\nflask/testsuite/templates/template_test.html,sha256=g3ZgUQN0PaOiz289_AxNeP3ICfR29ogzbQl3fCvxK_8,51\r\nflask/testsuite/templates/nested/nested.txt,sha256=76PlNDtwDVWjZMPHRlBqSX95jY52e_RWZCJKZfRWkAU,11\r\nflask/testsuite/test_apps/config_module_app.py,sha256=BaBJCCI4TcOc9Kc5OvlgmaCtfQH8D31xVZMLZ3FmyRE,101\r\nflask/testsuite/test_apps/flask_newext_simple.py,sha256=IIsV29nQ37pV2Z3O8GQ5a33YkIlII8B0rbOqz5k4ZxQ,25\r\nflask/testsuite/test_apps/importerror.py,sha256=gA8IjK673B4Rit7pYYnkspF2k9_zpztPmiMYgrwgzdk,46\r\nflask/testsuite/test_apps/main_app.py,sha256=mah5bd5ObZV6bl4YbnJEEdQcr5NqgMFmZqcaAITIReE,90\r\nflask/testsuite/test_apps/blueprintapp/__init__.py,sha256=OeOuAvS6IghuIekcXqfgPuoACL6JSxKw_xOpvgTx7lE,200\r\nflask/testsuite/test_apps/blueprintapp/apps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0\r\nflask/testsuite/test_apps/blueprintapp/apps/admin/__init__.py,sha256=L5kSKkfOewREXLveDLogxtGyF2UrkIczxo4PZrjYCl8,362\r\nflask/testsuite/test_apps/blueprintapp/apps/admin/static/test.txt,sha256=lcPiuni6LR_rw5mxyjRmz8iMcifiSSNqPFlIrmLKzjY,11\r\nflask/testsuite/test_apps/blueprintapp/apps/admin/static/css/test.css,sha256=F1DG-ABW3o6yAD9Nc6IzV9iYefZeOHhn59009LMJboY,18\r\nflask/testsuite/test_apps/blueprintapp/apps/admin/templates/admin/index.html,sha256=2OWS6QYqxaarnZAWkLvam0P2QSodRNkA6M05eEOVLw4,21\r\nflask/testsuite/test_apps/blueprintapp/apps/frontend/__init__.py,sha256=djItvU0fqQg-MOlVoJR3--6cYf4VT1SI0WFsQyjQk4o,204\r\nflask/testsuite/test_apps/blueprintapp/apps/frontend/templates/frontend/index.html,sha256=hcC7DORSYxGNK5DAICVx1BeFVlzaanxcIhODQwm9rwg,24\r\nflask/testsuite/test_apps/config_package_app/__init__.py,sha256=BaBJCCI4TcOc9Kc5OvlgmaCtfQH8D31xVZMLZ3FmyRE,101\r\nflask/testsuite/test_apps/flask_broken/__init__.py,sha256=CDC0TTkjrjeLs7ZXzLwdjS0yFiE2DM9uZ65q927Xx-c,48\r\nflask/testsuite/test_apps/flask_broken/b.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0\r\nflask/testsuite/test_apps/flask_newext_package/__init__.py,sha256=UX_8L5rL7scxeUhXbUklOXDzE16eQ0eSdykHJvCe9O4,26\r\nflask/testsuite/test_apps/flask_newext_package/submodule.py,sha256=VBKM2Msdeq6F7ziaPiwTbcu9c4wAH4kKZH6FDUPi6zg,35\r\nflask/testsuite/test_apps/flaskext/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0\r\nflask/testsuite/test_apps/flaskext/oldext_simple.py,sha256=fuHRIiStUQIS-JoiE_Vwkc_nRX3qkMETN1yBtEDQyck,25\r\nflask/testsuite/test_apps/flaskext/oldext_package/__init__.py,sha256=u6W0k3--q15e2nTlDWvTA0gvu1EuvaJQGIb-y9gPe8A,26\r\nflask/testsuite/test_apps/flaskext/oldext_package/submodule.py,sha256=VBKM2Msdeq6F7ziaPiwTbcu9c4wAH4kKZH6FDUPi6zg,35\r\nflask/testsuite/test_apps/lib/python2.5/site-packages/site_app.py,sha256=yObUTJgzGrSHwp-eLsE-bMbGmKLogUdE6bCn7jQPR6A,42\r\nflask/testsuite/test_apps/lib/python2.5/site-packages/SiteEgg.egg,sha256=fVBqIK3Yab7f_mM6B5dZO2zN1N9abqQKS1xRIbKNsgc,1218\r\nflask/testsuite/test_apps/lib/python2.5/site-packages/site_package/__init__.py,sha256=yObUTJgzGrSHwp-eLsE-bMbGmKLogUdE6bCn7jQPR6A,42\r\nflask/testsuite/test_apps/moduleapp/__init__.py,sha256=x5mMfvASdMFFNFp0tq2Fwpp_-9DxNlRwHIFxj_bhbnQ,188\r\nflask/testsuite/test_apps/moduleapp/apps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0\r\nflask/testsuite/test_apps/moduleapp/apps/admin/__init__.py,sha256=ESnyU_sz54kX22RJUOyciuHlGz0_c9d1qGxrzke9V7E,259\r\nflask/testsuite/test_apps/moduleapp/apps/admin/static/test.txt,sha256=lcPiuni6LR_rw5mxyjRmz8iMcifiSSNqPFlIrmLKzjY,11\r\nflask/testsuite/test_apps/moduleapp/apps/admin/static/css/test.css,sha256=F1DG-ABW3o6yAD9Nc6IzV9iYefZeOHhn59009LMJboY,18\r\nflask/testsuite/test_apps/moduleapp/apps/admin/templates/index.html,sha256=2OWS6QYqxaarnZAWkLvam0P2QSodRNkA6M05eEOVLw4,21\r\nflask/testsuite/test_apps/moduleapp/apps/frontend/__init__.py,sha256=qtVGS_XzTw3uxAyEcOi49uXB4o-u4ZEZLQrhwIUkEME,158\r\nflask/testsuite/test_apps/moduleapp/apps/frontend/templates/index.html,sha256=hcC7DORSYxGNK5DAICVx1BeFVlzaanxcIhODQwm9rwg,24\r\nflask/testsuite/test_apps/path/installed_package/__init__.py,sha256=yObUTJgzGrSHwp-eLsE-bMbGmKLogUdE6bCn7jQPR6A,42\r\nflask/testsuite/test_apps/subdomaintestmodule/__init__.py,sha256=o7W5jKRXGVqfjwYKWjI3QX8WUztGxuVnGiZ-wSGd1Fk,74\r\nflask/testsuite/test_apps/subdomaintestmodule/static/hello.txt,sha256=5PvE5WQoKT9dXkOTZ63vfG9F0iAysyTmSTX0dA4uiQI,16\r\nFlask-0.10.dist-info/DESCRIPTION.rst,sha256=YsWE_jM8p5TWeiY2cuesAHH5JUW95FFaHKvruzGCg5o,694\r\nFlask-0.10.dist-info/METADATA,sha256=pqbqQzdvCFKHyFRIFyxq9hyctjcYvH9MGStkHlbfBqk,1557\r\nFlask-0.10.dist-info/metadata.json,sha256=nWJBE8_HRpsHM1zLFJsfFrxuzec2njoS7UDgZMpCiFE,1011\r\nFlask-0.10.dist-info/RECORD,,\r\nFlask-0.10.dist-info/top_level.txt,sha256=dvi65F6AeGWVU0TBpYiC04yM60-FX1gJFkK31IKQr5c,6\r\nFlask-0.10.dist-info/WHEEL,sha256=54bVun1KfEBTJ68SHUmbxNPj80VxlQ0sHi4gZdGZXEY,92\r\nflask/config.pyc,,\r\nflask/testsuite/deprecations.pyc,,\r\nflask/testsuite/test_apps/flaskext/oldext_package/__init__.pyc,,\r\nflask/testsuite/test_apps/blueprintapp/__init__.pyc,,\r\nflask/testsuite/regression.pyc,,\r\nflask/module.pyc,,\r\nflask/debughelpers.pyc,,\r\nflask/testsuite/signals.pyc,,\r\nflask/testsuite/examples.pyc,,\r\nflask/testsuite/test_apps/blueprintapp/apps/frontend/__init__.pyc,,\r\nflask/testsuite/test_apps/moduleapp/apps/__init__.pyc,,\r\nflask/sessions.pyc,,\r\nflask/logging.pyc,,\r\nflask/testsuite/test_apps/path/installed_package/__init__.pyc,,\r\nflask/testsuite/test_apps/flask_broken/__init__.pyc,,\r\nflask/__init__.pyc,,\r\nflask/testsuite/config.pyc,,\r\nflask/testsuite/test_apps/importerror.pyc,,\r\nflask/testsuite/test_apps/flaskext/oldext_simple.pyc,,\r\nflask/testsuite/subclassing.pyc,,\r\nflask/testsuite/__init__.pyc,,\r\nflask/testsuite/test_apps/lib/python2.5/site-packages/site_package/__init__.pyc,,\r\nflask/globals.pyc,,\r\nflask/testsuite/test_apps/lib/python2.5/site-packages/site_app.pyc,,\r\nflask/testsuite/test_apps/subdomaintestmodule/__init__.pyc,,\r\nflask/views.pyc,,\r\nflask/json.pyc,,\r\nflask/testsuite/test_apps/flask_newext_simple.pyc,,\r\nflask/testsuite/test_apps/flask_broken/b.pyc,,\r\nflask/testsuite/test_apps/flask_newext_package/__init__.pyc,,\r\nflask/testsuite/test_apps/config_module_app.pyc,,\r\nflask/testsuite/blueprints.pyc,,\r\nflask/testsuite/test_apps/flaskext/oldext_package/submodule.pyc,,\r\nflask/blueprints.pyc,,\r\nflask/testsuite/test_apps/flaskext/__init__.pyc,,\r\nflask/exthook.pyc,,\r\nflask/testsuite/test_apps/blueprintapp/apps/__init__.pyc,,\r\nflask/testsuite/templating.pyc,,\r\nflask/testsuite/test_apps/main_app.pyc,,\r\nflask/testsuite/testing.pyc,,\r\nflask/_compat.pyc,,\r\nflask/ctx.pyc,,\r\nflask/testsuite/test_apps/moduleapp/apps/admin/__init__.pyc,,\r\nflask/testsuite/test_apps/moduleapp/__init__.pyc,,\r\nflask/testsuite/appctx.pyc,,\r\nflask/app.pyc,,\r\nflask/ext/__init__.pyc,,\r\nflask/testing.pyc,,\r\nflask/wrappers.pyc,,\r\nflask/testsuite/helpers.pyc,,\r\nflask/helpers.pyc,,\r\nflask/testsuite/test_apps/moduleapp/apps/frontend/__init__.pyc,,\r\nflask/testsuite/views.pyc,,\r\nflask/signals.pyc,,\r\nflask/testsuite/test_apps/flask_newext_package/submodule.pyc,,\r\nflask/testsuite/basic.pyc,,\r\nflask/templating.pyc,,\r\nflask/testsuite/test_apps/blueprintapp/apps/admin/__init__.pyc,,\r\nflask/testsuite/reqctx.pyc,,\r\nflask/testsuite/ext.pyc,,\r\nflask/testsuite/test_apps/config_package_app/__init__.pyc,,\r\n"
  },
  {
    "path": "lib/Flask-0.10.dist-info/WHEEL",
    "content": "Wheel-Version: 1.0\nGenerator: bdist_wheel (0.24.0)\nRoot-Is-Purelib: true\nTag: py2-none-any\n\n"
  },
  {
    "path": "lib/Flask-0.10.dist-info/metadata.json",
    "content": "{\"license\": \"BSD\", \"name\": \"Flask\", \"metadata_version\": \"2.0\", \"generator\": \"bdist_wheel (0.24.0)\", \"summary\": \"A microframework based on Werkzeug, Jinja2 and good intentions\", \"platform\": \"any\", \"run_requires\": [{\"requires\": [\"Werkzeug (>=0.7)\", \"Jinja2 (>=2.4)\", \"itsdangerous (>=0.21)\"]}], \"version\": \"0.10\", \"extensions\": {\"python.details\": {\"project_urls\": {\"Home\": \"http://github.com/mitsuhiko/flask/\"}, \"document_names\": {\"description\": \"DESCRIPTION.rst\"}, \"contacts\": [{\"role\": \"author\", \"email\": \"armin.ronacher@active-4.com\", \"name\": \"Armin Ronacher\"}]}}, \"classifiers\": [\"Development Status :: 4 - Beta\", \"Environment :: Web Environment\", \"Intended Audience :: Developers\", \"License :: OSI Approved :: BSD License\", \"Operating System :: OS Independent\", \"Programming Language :: Python\", \"Programming Language :: Python :: 2.6\", \"Programming Language :: Python :: 2.7\", \"Topic :: Internet :: WWW/HTTP :: Dynamic Content\", \"Topic :: Software Development :: Libraries :: Python Modules\"], \"extras\": []}"
  },
  {
    "path": "lib/Flask-0.10.dist-info/top_level.txt",
    "content": "flask\n"
  },
  {
    "path": "lib/Jinja2-2.8.dist-info/DESCRIPTION.rst",
    "content": "Jinja2\n~~~~~~\n\nJinja2 is a template engine written in pure Python.  It provides a\n`Django`_ inspired non-XML syntax but supports inline expressions and\nan optional `sandboxed`_ environment.\n\nNutshell\n--------\n\nHere a small example of a Jinja template::\n\n    {% extends 'base.html' %}\n    {% block title %}Memberlist{% endblock %}\n    {% block content %}\n      <ul>\n      {% for user in users %}\n        <li><a href=\"{{ user.url }}\">{{ user.username }}</a></li>\n      {% endfor %}\n      </ul>\n    {% endblock %}\n\nPhilosophy\n----------\n\nApplication logic is for the controller but don't try to make the life\nfor the template designer too hard by giving him too few functionality.\n\nFor more informations visit the new `Jinja2 webpage`_ and `documentation`_.\n\n.. _sandboxed: http://en.wikipedia.org/wiki/Sandbox_(computer_security)\n.. _Django: http://www.djangoproject.com/\n.. _Jinja2 webpage: http://jinja.pocoo.org/\n.. _documentation: http://jinja.pocoo.org/2/documentation/\n\n\n"
  },
  {
    "path": "lib/Jinja2-2.8.dist-info/METADATA",
    "content": "Metadata-Version: 2.0\nName: Jinja2\nVersion: 2.8\nSummary: A small but fast and easy to use stand-alone template engine written in pure python.\nHome-page: http://jinja.pocoo.org/\nAuthor: Armin Ronacher\nAuthor-email: armin.ronacher@active-4.com\nLicense: BSD\nPlatform: UNKNOWN\nClassifier: Development Status :: 5 - Production/Stable\nClassifier: Environment :: Web Environment\nClassifier: Intended Audience :: Developers\nClassifier: License :: OSI Approved :: BSD License\nClassifier: Operating System :: OS Independent\nClassifier: Programming Language :: Python\nClassifier: Programming Language :: Python :: 2\nClassifier: Programming Language :: Python :: 2.6\nClassifier: Programming Language :: Python :: 2.7\nClassifier: Programming Language :: Python :: 3\nClassifier: Programming Language :: Python :: 3.3\nClassifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content\nClassifier: Topic :: Software Development :: Libraries :: Python Modules\nClassifier: Topic :: Text Processing :: Markup :: HTML\nRequires-Dist: MarkupSafe\nProvides-Extra: i18n\nRequires-Dist: Babel (>=0.8); extra == 'i18n'\n\nJinja2\n~~~~~~\n\nJinja2 is a template engine written in pure Python.  It provides a\n`Django`_ inspired non-XML syntax but supports inline expressions and\nan optional `sandboxed`_ environment.\n\nNutshell\n--------\n\nHere a small example of a Jinja template::\n\n    {% extends 'base.html' %}\n    {% block title %}Memberlist{% endblock %}\n    {% block content %}\n      <ul>\n      {% for user in users %}\n        <li><a href=\"{{ user.url }}\">{{ user.username }}</a></li>\n      {% endfor %}\n      </ul>\n    {% endblock %}\n\nPhilosophy\n----------\n\nApplication logic is for the controller but don't try to make the life\nfor the template designer too hard by giving him too few functionality.\n\nFor more informations visit the new `Jinja2 webpage`_ and `documentation`_.\n\n.. _sandboxed: http://en.wikipedia.org/wiki/Sandbox_(computer_security)\n.. _Django: http://www.djangoproject.com/\n.. _Jinja2 webpage: http://jinja.pocoo.org/\n.. _documentation: http://jinja.pocoo.org/2/documentation/\n\n\n"
  },
  {
    "path": "lib/Jinja2-2.8.dist-info/RECORD",
    "content": "jinja2/__init__.py,sha256=c59bnaAFo63I7lYUZlO2UKHj8LPG3JACKnCrwWgvjGY,2326\r\njinja2/_compat.py,sha256=O4FnYOMi4HRBfoCKkX137tt3sR6HvpnQNcwqg8ARYog,3109\r\njinja2/_stringdefs.py,sha256=SFObWX5vSMeGNc_aSO3_B2EEmScCstFWtjS4K0YFBXk,404291\r\njinja2/bccache.py,sha256=EMN9fsvOpwK3DfxQ9F1lmWoxU2Qlo6AnNhPXTsMrw84,12793\r\njinja2/compiler.py,sha256=nQmoS6HpGwgDIC8UXkSdjPYiAjbVqZ-Gf4odO-SAR6E,63846\r\njinja2/constants.py,sha256=DCr-oKC2xQO-fkOQO3kXRJW7rEYgmcsMRNpPnM66YSU,1626\r\njinja2/debug.py,sha256=GEGHM8vFsNFF-kGc0_fwyj1ftMtuyaH4r0nyG-XA9Z8,11553\r\njinja2/defaults.py,sha256=eLMOE7JC52QwZBu5Gz4TPZqzoJy9IgV5EynL_pW7MUw,1057\r\njinja2/environment.py,sha256=jzJmujSFtxb1HvITO4TdUCOOA-hSZx0gHrxeDZ2VE-M,48120\r\njinja2/exceptions.py,sha256=Q9yZOUif-lhVj5BRw0ELjfBvEdBsB7xZobgOvC2qGy4,4428\r\njinja2/ext.py,sha256=X-1zCiut1cuxIteKPkJr3jb6odlVE1jciO8RnrMniPE,25072\r\njinja2/filters.py,sha256=R4x2flPfyzIjrtItzpGpK4LzBvx-NOlEXH9wD-ZBWtU,30115\r\njinja2/lexer.py,sha256=QyiQwAQVEE2YREZJLcA04F3yqv0XOwBbSlWaFW4xJ20,28425\r\njinja2/loaders.py,sha256=BgDCvmiB0gH_zPMf-6TMemqtJdrck3IyJ8g0kWUvFa0,17380\r\njinja2/meta.py,sha256=cxAOtMuSWWSQX2H8zhYsAtjNwRcNB8Zvs06Y-JlWnbk,4198\r\njinja2/nodes.py,sha256=YN6hfFa0WlfToG2r-Q-yhUkAUp0O9l8KulK53mOAVUo,28954\r\njinja2/optimizer.py,sha256=bNNKbo5SC5FBUm9dvP-I3GkiXZYBYIER7_g9hK77ZVI,2302\r\njinja2/parser.py,sha256=pjLfkZDg2IKJKt_ixNosV-RzwAja5GWYuVeBQumIRns,35442\r\njinja2/runtime.py,sha256=Ct36Q9-gVmKer45syS4j3thQ15T_DnLDh6CqvTcnPwQ,22530\r\njinja2/sandbox.py,sha256=qgH4CoBsF5NwGj0krqsCOw8sg2mXmfpZKnvmZEE-da4,13327\r\njinja2/tests.py,sha256=znB0L_k6wdKp_lQJvxboXwUXDy1HhFe5SSA888tHt_w,4131\r\njinja2/utils.py,sha256=pjbOhQJ5NYexu2MbjA66nBibudUkYcQRZbxvbYE0tFk,16560\r\njinja2/visitor.py,sha256=3hEAYD26xS_JiJBf4RfcqYPpiuR6efOH8Hh6om59eU8,3316\r\nJinja2-2.8.dist-info/DESCRIPTION.rst,sha256=CXIS1UnPSk5_lZBS6Lb8ko-3lqGfjsiUwNBLXCTj2lc,975\r\nJinja2-2.8.dist-info/entry_points.txt,sha256=NdzVcOrqyNyKDxD09aERj__3bFx2paZhizFDsKmVhiA,72\r\nJinja2-2.8.dist-info/METADATA,sha256=Vio5F8qaEVcGzaCV1rl8tIWEKsHUFSSSAfL0u9oMmGk,2061\r\nJinja2-2.8.dist-info/metadata.json,sha256=4TsqsSBwGwy0C2xF_uRZHYsRn2W5Lv4NUMBjTnXPldM,1275\r\nJinja2-2.8.dist-info/RECORD,,\r\nJinja2-2.8.dist-info/top_level.txt,sha256=PkeVWtLb3-CqjWi1fO29OCbj55EhX_chhKrCdrVe_zs,7\r\nJinja2-2.8.dist-info/WHEEL,sha256=AvR0WeTpDaxT645bl5FQxUK6NPsTls2ttpcGJg3j1Xg,110\r\njinja2/_compat.pyc,,\r\njinja2/sandbox.pyc,,\r\njinja2/_stringdefs.pyc,,\r\njinja2/bccache.pyc,,\r\njinja2/runtime.pyc,,\r\njinja2/utils.pyc,,\r\njinja2/debug.pyc,,\r\njinja2/parser.pyc,,\r\njinja2/defaults.pyc,,\r\njinja2/visitor.pyc,,\r\njinja2/ext.pyc,,\r\njinja2/lexer.pyc,,\r\njinja2/nodes.pyc,,\r\njinja2/environment.pyc,,\r\njinja2/compiler.pyc,,\r\njinja2/exceptions.pyc,,\r\njinja2/__init__.pyc,,\r\njinja2/meta.pyc,,\r\njinja2/loaders.pyc,,\r\njinja2/optimizer.pyc,,\r\njinja2/filters.pyc,,\r\njinja2/tests.pyc,,\r\njinja2/constants.pyc,,\r\n"
  },
  {
    "path": "lib/Jinja2-2.8.dist-info/WHEEL",
    "content": "Wheel-Version: 1.0\nGenerator: bdist_wheel (0.24.0)\nRoot-Is-Purelib: true\nTag: py2-none-any\nTag: py3-none-any\n\n"
  },
  {
    "path": "lib/Jinja2-2.8.dist-info/entry_points.txt",
    "content": "\n    [babel.extractors]\n    jinja2 = jinja2.ext:babel_extract[i18n]\n    "
  },
  {
    "path": "lib/Jinja2-2.8.dist-info/metadata.json",
    "content": "{\"license\": \"BSD\", \"name\": \"Jinja2\", \"metadata_version\": \"2.0\", \"generator\": \"bdist_wheel (0.24.0)\", \"summary\": \"A small but fast and easy to use stand-alone template engine written in pure python.\", \"run_requires\": [{\"requires\": [\"Babel (>=0.8)\"], \"extra\": \"i18n\"}, {\"requires\": [\"MarkupSafe\"]}], \"version\": \"2.8\", \"extensions\": {\"python.details\": {\"project_urls\": {\"Home\": \"http://jinja.pocoo.org/\"}, \"document_names\": {\"description\": \"DESCRIPTION.rst\"}, \"contacts\": [{\"role\": \"author\", \"email\": \"armin.ronacher@active-4.com\", \"name\": \"Armin Ronacher\"}]}, \"python.exports\": {\"babel.extractors\": {\"jinja2\": \"jinja2.ext:babel_extract [i18n]\"}}}, \"classifiers\": [\"Development Status :: 5 - Production/Stable\", \"Environment :: Web Environment\", \"Intended Audience :: Developers\", \"License :: OSI Approved :: BSD License\", \"Operating System :: OS Independent\", \"Programming Language :: Python\", \"Programming Language :: Python :: 2\", \"Programming Language :: Python :: 2.6\", \"Programming Language :: Python :: 2.7\", \"Programming Language :: Python :: 3\", \"Programming Language :: Python :: 3.3\", \"Topic :: Internet :: WWW/HTTP :: Dynamic Content\", \"Topic :: Software Development :: Libraries :: Python Modules\", \"Topic :: Text Processing :: Markup :: HTML\"], \"extras\": [\"i18n\"]}"
  },
  {
    "path": "lib/Jinja2-2.8.dist-info/top_level.txt",
    "content": "jinja2\n"
  },
  {
    "path": "lib/MarkupSafe-0.23.dist-info/DESCRIPTION.rst",
    "content": "MarkupSafe\n==========\n\nImplements a unicode subclass that supports HTML strings:\n\n>>> from markupsafe import Markup, escape\n>>> escape(\"<script>alert(document.cookie);</script>\")\nMarkup(u'&lt;script&gt;alert(document.cookie);&lt;/script&gt;')\n>>> tmpl = Markup(\"<em>%s</em>\")\n>>> tmpl % \"Peter > Lustig\"\nMarkup(u'<em>Peter &gt; Lustig</em>')\n\nIf you want to make an object unicode that is not yet unicode\nbut don't want to lose the taint information, you can use the\n`soft_unicode` function.  (On Python 3 you can also use `soft_str` which\nis a different name for the same function).\n\n>>> from markupsafe import soft_unicode\n>>> soft_unicode(42)\nu'42'\n>>> soft_unicode(Markup('foo'))\nMarkup(u'foo')\n\nHTML Representations\n--------------------\n\nObjects can customize their HTML markup equivalent by overriding\nthe `__html__` function:\n\n>>> class Foo(object):\n...  def __html__(self):\n...   return '<strong>Nice</strong>'\n...\n>>> escape(Foo())\nMarkup(u'<strong>Nice</strong>')\n>>> Markup(Foo())\nMarkup(u'<strong>Nice</strong>')\n\nSilent Escapes\n--------------\n\nSince MarkupSafe 0.10 there is now also a separate escape function\ncalled `escape_silent` that returns an empty string for `None` for\nconsistency with other systems that return empty strings for `None`\nwhen escaping (for instance Pylons' webhelpers).\n\nIf you also want to use this for the escape method of the Markup\nobject, you can create your own subclass that does that::\n\n    from markupsafe import Markup, escape_silent as escape\n\n    class SilentMarkup(Markup):\n        __slots__ = ()\n\n        @classmethod\n        def escape(cls, s):\n            return cls(escape(s))\n\nNew-Style String Formatting\n---------------------------\n\nStarting with MarkupSafe 0.21 new style string formats from Python 2.6 and\n3.x are now fully supported.  Previously the escape behavior of those\nfunctions was spotty at best.  The new implementations operates under the\nfollowing algorithm:\n\n1.  if an object has an ``__html_format__`` method it is called as\n    replacement for ``__format__`` with the format specifier.  It either\n    has to return a string or markup object.\n2.  if an object has an ``__html__`` method it is called.\n3.  otherwise the default format system of Python kicks in and the result\n    is HTML escaped.\n\nHere is how you can implement your own formatting::\n\n    class User(object):\n\n        def __init__(self, id, username):\n            self.id = id\n            self.username = username\n\n        def __html_format__(self, format_spec):\n            if format_spec == 'link':\n                return Markup('<a href=\"/user/{0}\">{1}</a>').format(\n                    self.id,\n                    self.__html__(),\n                )\n            elif format_spec:\n                raise ValueError('Invalid format spec')\n            return self.__html__()\n\n        def __html__(self):\n            return Markup('<span class=user>{0}</span>').format(self.username)\n\nAnd to format that user:\n\n>>> user = User(1, 'foo')\n>>> Markup('<p>User: {0:link}').format(user)\nMarkup(u'<p>User: <a href=\"/user/1\"><span class=user>foo</span></a>')\n\n\n"
  },
  {
    "path": "lib/MarkupSafe-0.23.dist-info/METADATA",
    "content": "Metadata-Version: 2.0\nName: MarkupSafe\nVersion: 0.23\nSummary: Implements a XML/HTML/XHTML Markup safe string for Python\nHome-page: http://github.com/mitsuhiko/markupsafe\nAuthor: Armin Ronacher\nAuthor-email: armin.ronacher@active-4.com\nLicense: BSD\nPlatform: UNKNOWN\nClassifier: Development Status :: 5 - Production/Stable\nClassifier: Environment :: Web Environment\nClassifier: Intended Audience :: Developers\nClassifier: License :: OSI Approved :: BSD License\nClassifier: Operating System :: OS Independent\nClassifier: Programming Language :: Python\nClassifier: Programming Language :: Python :: 3\nClassifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content\nClassifier: Topic :: Software Development :: Libraries :: Python Modules\nClassifier: Topic :: Text Processing :: Markup :: HTML\n\nMarkupSafe\n==========\n\nImplements a unicode subclass that supports HTML strings:\n\n>>> from markupsafe import Markup, escape\n>>> escape(\"<script>alert(document.cookie);</script>\")\nMarkup(u'&lt;script&gt;alert(document.cookie);&lt;/script&gt;')\n>>> tmpl = Markup(\"<em>%s</em>\")\n>>> tmpl % \"Peter > Lustig\"\nMarkup(u'<em>Peter &gt; Lustig</em>')\n\nIf you want to make an object unicode that is not yet unicode\nbut don't want to lose the taint information, you can use the\n`soft_unicode` function.  (On Python 3 you can also use `soft_str` which\nis a different name for the same function).\n\n>>> from markupsafe import soft_unicode\n>>> soft_unicode(42)\nu'42'\n>>> soft_unicode(Markup('foo'))\nMarkup(u'foo')\n\nHTML Representations\n--------------------\n\nObjects can customize their HTML markup equivalent by overriding\nthe `__html__` function:\n\n>>> class Foo(object):\n...  def __html__(self):\n...   return '<strong>Nice</strong>'\n...\n>>> escape(Foo())\nMarkup(u'<strong>Nice</strong>')\n>>> Markup(Foo())\nMarkup(u'<strong>Nice</strong>')\n\nSilent Escapes\n--------------\n\nSince MarkupSafe 0.10 there is now also a separate escape function\ncalled `escape_silent` that returns an empty string for `None` for\nconsistency with other systems that return empty strings for `None`\nwhen escaping (for instance Pylons' webhelpers).\n\nIf you also want to use this for the escape method of the Markup\nobject, you can create your own subclass that does that::\n\n    from markupsafe import Markup, escape_silent as escape\n\n    class SilentMarkup(Markup):\n        __slots__ = ()\n\n        @classmethod\n        def escape(cls, s):\n            return cls(escape(s))\n\nNew-Style String Formatting\n---------------------------\n\nStarting with MarkupSafe 0.21 new style string formats from Python 2.6 and\n3.x are now fully supported.  Previously the escape behavior of those\nfunctions was spotty at best.  The new implementations operates under the\nfollowing algorithm:\n\n1.  if an object has an ``__html_format__`` method it is called as\n    replacement for ``__format__`` with the format specifier.  It either\n    has to return a string or markup object.\n2.  if an object has an ``__html__`` method it is called.\n3.  otherwise the default format system of Python kicks in and the result\n    is HTML escaped.\n\nHere is how you can implement your own formatting::\n\n    class User(object):\n\n        def __init__(self, id, username):\n            self.id = id\n            self.username = username\n\n        def __html_format__(self, format_spec):\n            if format_spec == 'link':\n                return Markup('<a href=\"/user/{0}\">{1}</a>').format(\n                    self.id,\n                    self.__html__(),\n                )\n            elif format_spec:\n                raise ValueError('Invalid format spec')\n            return self.__html__()\n\n        def __html__(self):\n            return Markup('<span class=user>{0}</span>').format(self.username)\n\nAnd to format that user:\n\n>>> user = User(1, 'foo')\n>>> Markup('<p>User: {0:link}').format(user)\nMarkup(u'<p>User: <a href=\"/user/1\"><span class=user>foo</span></a>')\n\n\n"
  },
  {
    "path": "lib/MarkupSafe-0.23.dist-info/RECORD",
    "content": "markupsafe/__init__.py,sha256=zFQpANILi3mCCALiPd6ZJdlW6ibu_hTKzikMXKXVtaM,10338\r\nmarkupsafe/_compat.py,sha256=r1HE0CpcAZeb-AiTV9wITR91PeLHn0CzZ_XHkYoozpI,565\r\nmarkupsafe/_constants.py,sha256=U_xybFQsyXKCgHSfranJnFzo-z9nn9fuBeSk243sE5Q,4795\r\nmarkupsafe/_native.py,sha256=E2Un1ysOf-w45d18YCj8UelT5UP7Vt__IuFPYJ7YRIs,1187\r\nmarkupsafe/_speedups.c,sha256=gZwPEM_0zcbAzJjPuPYXk97R67QR1uUGtDvOPsvirCA,5939\r\nmarkupsafe/_speedups.so,sha256=5LwzbsIbi6XRYL1cFO-TEF5szplVD406i-FXsWCgcPU,26724\r\nmarkupsafe/tests.py,sha256=RLI4eYI0ICNZwkoN638VHXf_fDu4d_jnvbGr22j58Ng,6107\r\nMarkupSafe-0.23.dist-info/DESCRIPTION.rst,sha256=VnEbwPneiOkqh-nzxb0DUiGlcVGHuaDQjsNBLi-yNYw,3091\r\nMarkupSafe-0.23.dist-info/METADATA,sha256=g-KikeSr9J7vagkJoCt0ViT2ORy9O4NYV7XtRu1Pni8,3879\r\nMarkupSafe-0.23.dist-info/metadata.json,sha256=jNrdilCdPfPmCPCQj9EVQSAebHgG8jCtlhqsPMggI4s,901\r\nMarkupSafe-0.23.dist-info/RECORD,,\r\nMarkupSafe-0.23.dist-info/top_level.txt,sha256=qy0Plje5IJuvsCBjejJyhDCjEAdcDLK_2agVcex8Z6U,11\r\nMarkupSafe-0.23.dist-info/WHEEL,sha256=xNbhRJkOYpM8X1K1ysQX8xjULvydXjcUxM96PNX_KQ8,109\r\nmarkupsafe/_native.pyc,,\r\nmarkupsafe/_constants.pyc,,\r\nmarkupsafe/_compat.pyc,,\r\nmarkupsafe/tests.pyc,,\r\nmarkupsafe/__init__.pyc,,\r\n"
  },
  {
    "path": "lib/MarkupSafe-0.23.dist-info/WHEEL",
    "content": "Wheel-Version: 1.0\nGenerator: bdist_wheel (0.24.0)\nRoot-Is-Purelib: false\nTag: cp27-none-macosx_10_10_intel\n\n"
  },
  {
    "path": "lib/MarkupSafe-0.23.dist-info/metadata.json",
    "content": "{\"summary\": \"Implements a XML/HTML/XHTML Markup safe string for Python\", \"metadata_version\": \"2.0\", \"license\": \"BSD\", \"extensions\": {\"python.details\": {\"project_urls\": {\"Home\": \"http://github.com/mitsuhiko/markupsafe\"}, \"contacts\": [{\"role\": \"author\", \"email\": \"armin.ronacher@active-4.com\", \"name\": \"Armin Ronacher\"}], \"document_names\": {\"description\": \"DESCRIPTION.rst\"}}}, \"generator\": \"bdist_wheel (0.24.0)\", \"classifiers\": [\"Development Status :: 5 - Production/Stable\", \"Environment :: Web Environment\", \"Intended Audience :: Developers\", \"License :: OSI Approved :: BSD License\", \"Operating System :: OS Independent\", \"Programming Language :: Python\", \"Programming Language :: Python :: 3\", \"Topic :: Internet :: WWW/HTTP :: Dynamic Content\", \"Topic :: Software Development :: Libraries :: Python Modules\", \"Topic :: Text Processing :: Markup :: HTML\"], \"version\": \"0.23\", \"name\": \"MarkupSafe\"}"
  },
  {
    "path": "lib/MarkupSafe-0.23.dist-info/top_level.txt",
    "content": "markupsafe\n"
  },
  {
    "path": "lib/README.md",
    "content": "This directory contains third-party dependencies installed with `pip`."
  },
  {
    "path": "lib/Werkzeug-0.11.dist-info/DESCRIPTION.rst",
    "content": "Werkzeug\n========\n\nWerkzeug started as simple collection of various utilities for WSGI\napplications and has become one of the most advanced WSGI utility\nmodules.  It includes a powerful debugger, full featured request and\nresponse objects, HTTP utilities to handle entity tags, cache control\nheaders, HTTP dates, cookie handling, file uploads, a powerful URL\nrouting system and a bunch of community contributed addon modules.\n\nWerkzeug is unicode aware and doesn't enforce a specific template\nengine, database adapter or anything else.  It doesn't even enforce\na specific way of handling requests and leaves all that up to the\ndeveloper. It's most useful for end user applications which should work\non as many server environments as possible (such as blogs, wikis,\nbulletin boards, etc.).\n\nDetails and example applications are available on the\n`Werkzeug website <http://werkzeug.pocoo.org/>`_.\n\n\nFeatures\n--------\n\n-   unicode awareness\n\n-   request and response objects\n\n-   various utility functions for dealing with HTTP headers such as\n    `Accept` and `Cache-Control` headers.\n\n-   thread local objects with proper cleanup at request end\n\n-   an interactive debugger\n\n-   A simple WSGI server with support for threading and forking\n    with an automatic reloader.\n\n-   a flexible URL routing system with REST support.\n\n-   fully WSGI compatible\n\n\nDevelopment Version\n-------------------\n\nThe Werkzeug development version can be installed by cloning the git\nrepository from `github`_::\n\n    git clone git@github.com:mitsuhiko/werkzeug.git\n\n.. _github: http://github.com/mitsuhiko/werkzeug\n\n\n"
  },
  {
    "path": "lib/Werkzeug-0.11.dist-info/METADATA",
    "content": "Metadata-Version: 2.0\nName: Werkzeug\nVersion: 0.11\nSummary: The Swiss Army knife of Python web development\nHome-page: http://werkzeug.pocoo.org/\nAuthor: Armin Ronacher\nAuthor-email: armin.ronacher@active-4.com\nLicense: BSD\nPlatform: any\nClassifier: Development Status :: 5 - Production/Stable\nClassifier: Environment :: Web Environment\nClassifier: Intended Audience :: Developers\nClassifier: License :: OSI Approved :: BSD License\nClassifier: Operating System :: OS Independent\nClassifier: Programming Language :: Python\nClassifier: Programming Language :: Python :: 2\nClassifier: Programming Language :: Python :: 2.6\nClassifier: Programming Language :: Python :: 2.7\nClassifier: Programming Language :: Python :: 3\nClassifier: Programming Language :: Python :: 3.3\nClassifier: Programming Language :: Python :: 3.4\nClassifier: Programming Language :: Python :: 3.5\nClassifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content\nClassifier: Topic :: Software Development :: Libraries :: Python Modules\n\nWerkzeug\n========\n\nWerkzeug started as simple collection of various utilities for WSGI\napplications and has become one of the most advanced WSGI utility\nmodules.  It includes a powerful debugger, full featured request and\nresponse objects, HTTP utilities to handle entity tags, cache control\nheaders, HTTP dates, cookie handling, file uploads, a powerful URL\nrouting system and a bunch of community contributed addon modules.\n\nWerkzeug is unicode aware and doesn't enforce a specific template\nengine, database adapter or anything else.  It doesn't even enforce\na specific way of handling requests and leaves all that up to the\ndeveloper. It's most useful for end user applications which should work\non as many server environments as possible (such as blogs, wikis,\nbulletin boards, etc.).\n\nDetails and example applications are available on the\n`Werkzeug website <http://werkzeug.pocoo.org/>`_.\n\n\nFeatures\n--------\n\n-   unicode awareness\n\n-   request and response objects\n\n-   various utility functions for dealing with HTTP headers such as\n    `Accept` and `Cache-Control` headers.\n\n-   thread local objects with proper cleanup at request end\n\n-   an interactive debugger\n\n-   A simple WSGI server with support for threading and forking\n    with an automatic reloader.\n\n-   a flexible URL routing system with REST support.\n\n-   fully WSGI compatible\n\n\nDevelopment Version\n-------------------\n\nThe Werkzeug development version can be installed by cloning the git\nrepository from `github`_::\n\n    git clone git@github.com:mitsuhiko/werkzeug.git\n\n.. _github: http://github.com/mitsuhiko/werkzeug\n\n\n"
  },
  {
    "path": "lib/Werkzeug-0.11.dist-info/RECORD",
    "content": "Werkzeug-0.11.dist-info/DESCRIPTION.rst,sha256=5sTwZ_Sj5aeEN8mlcOdNJ_ng40HiGazGmILLyTMX8o0,1595\r\nWerkzeug-0.11.dist-info/METADATA,sha256=QX9osuhRKD2M0jRKGyVmOASL5y3INKSLtA4d0GSpsbM,2597\r\nWerkzeug-0.11.dist-info/RECORD,,\r\nWerkzeug-0.11.dist-info/WHEEL,sha256=GrqQvamwgBV4nLoJe0vhYRSWzWsx7xjlt74FT0SWYfE,110\r\nWerkzeug-0.11.dist-info/metadata.json,sha256=3rlxBTLVZ6cqm8wuS4n6ZgpoywLEfrpXWVahLNaFoVM,1093\r\nWerkzeug-0.11.dist-info/top_level.txt,sha256=QRyj2VjwJoQkrwjwFIOlB8Xg3r9un0NtqVHQF-15xaw,9\r\nwerkzeug/__init__.py,sha256=Nf_xs5zUQajNujPuiuiFWoGok3W9fmC-7BHJy8-2pok,6917\r\nwerkzeug/_compat.py,sha256=8c4U9o6A_TR9nKCcTbpZNxpqCXcXDVIbFawwKM2s92c,6311\r\nwerkzeug/_internal.py,sha256=IEScSoFtQ8KqFH_2ubdfscNAdQ2RIysyVupI5BR9W2U,13709\r\nwerkzeug/_reloader.py,sha256=glTJPAR6qz3hLYw7xsANeNlEvgEf_WeU2cTz66rUqK8,8548\r\nwerkzeug/datastructures.py,sha256=iQ4TqWXdHSXtL5srpP8t-6bEJEiKDkfiI8lHOl_A_kU,87447\r\nwerkzeug/exceptions.py,sha256=X7D6bNqLmXfftc-6kuifVGFaxngHbMm8QD4DSZ7K5vA,18609\r\nwerkzeug/filesystem.py,sha256=0_gjAftvnRBxoD6ZCssJDJztUjprsLC97eC_k4YRdXs,2174\r\nwerkzeug/formparser.py,sha256=ndLQxfmq-IeNUlee30WHfxq1YggzSO1l7QGeeFVr99M,21207\r\nwerkzeug/http.py,sha256=I4yzJHGnsaMW7kZQcWzNW9H7ijXT_iPR16jbN3jejVY,35031\r\nwerkzeug/local.py,sha256=vWF4ECvkbXoOWM4BThsU5qEzC2LwdiEn7WA-qEt8pvg,14123\r\nwerkzeug/posixemulation.py,sha256=xEF2Bxc-vUCPkiu4IbfWVd3LW7DROYAT-ExW6THqyzw,3519\r\nwerkzeug/routing.py,sha256=U6d5l9iRrntZXkhr-GFQUmz9KBM_YKSr1oVSB9Ppv5k,66260\r\nwerkzeug/script.py,sha256=DwaVDcXdaOTffdNvlBdLitxWXjKaRVT32VbhDtljFPY,11365\r\nwerkzeug/security.py,sha256=tuVc22OqoHV5K-TrYJmynCJJa12aUt9BQ3wR_vEPQ34,8971\r\nwerkzeug/serving.py,sha256=Jf2GLYlXLkVBShH4x3rHKdNBGNjT2pZHStSP0-1wF5Y,27228\r\nwerkzeug/test.py,sha256=nan0aDi3g5hyUzWCtaN3XL9HrbIsNNNgMNjwpfM6qMc,34152\r\nwerkzeug/testapp.py,sha256=3HQRW1sHZKXuAjCvFMet4KXtQG3loYTFnvn6LWt-4zI,9396\r\nwerkzeug/urls.py,sha256=xhJoL81fOOWH2W0MReJKW2-KoR0b3p4zYkcvqylw254,36634\r\nwerkzeug/useragents.py,sha256=uqpgPcJ5BfcCVh9nPIIl2r3duIrIuENmrbRqbAMmPDk,5418\r\nwerkzeug/utils.py,sha256=lkybtv_mq35zV1qhelvEcILTzrMUwZ9yon6E8XwapJE,22972\r\nwerkzeug/wrappers.py,sha256=lKYevpKD1-quk9Cop7bsFxt1eWJxU3h33HCnOI_YzSU,77011\r\nwerkzeug/wsgi.py,sha256=CP-hCwH8te4cFz1bzWJoITJ5j-7E4j55fBkmuyp8xvc,37881\r\nwerkzeug/contrib/__init__.py,sha256=f7PfttZhbrImqpr5Ezre8CXgwvcGUJK7zWNpO34WWrw,623\r\nwerkzeug/contrib/atom.py,sha256=rvijBrphjMzVObfuCR6ddu6aLwI_SiNiudu64OSTh4Q,15588\r\nwerkzeug/contrib/cache.py,sha256=4W2WCT9Hw6HEU8yME9GuU4Xf8e50r2K84ASMxhLb6tY,27983\r\nwerkzeug/contrib/fixers.py,sha256=MtN_YmENxoTsGvXGGERmtbQ62LaeFc5I2d1YifXNENA,10183\r\nwerkzeug/contrib/iterio.py,sha256=pTX36rYCKO_9IEoB5sIN5cFSYszI9zdx6YhquWovcPY,10814\r\nwerkzeug/contrib/jsrouting.py,sha256=QTmgeDoKXvNK02KzXgx9lr3cAH6fAzpwF5bBdPNvJPs,8564\r\nwerkzeug/contrib/limiter.py,sha256=iS8-ahPZ-JLRnmfIBzxpm7O_s3lPsiDMVWv7llAIDCI,1334\r\nwerkzeug/contrib/lint.py,sha256=UxVVvYwnKa5BqYJdgfAzNc2w834OKgguvN-wg8E1Dhc,12322\r\nwerkzeug/contrib/profiler.py,sha256=ISwCWvwVyGpDLRBRpLjo_qUWma6GXYBrTAco4PEQSHY,5151\r\nwerkzeug/contrib/securecookie.py,sha256=X-Ao_0NRDveW6K1Fhe4U42hHWBW8esCpA3VcBDpzWIk,12206\r\nwerkzeug/contrib/sessions.py,sha256=uAPcnyxaxEla-bUA13gKc3KK4mwSagdzbCZzyKl3PeE,12577\r\nwerkzeug/contrib/testtools.py,sha256=G9xN-qeihJlhExrIZMCahvQOIDxdL9NiX874jiiHFMs,2453\r\nwerkzeug/contrib/wrappers.py,sha256=Uv5FRO5OqKwOsNgkW2-FRcw0vUDe3uiaivjPNYWNfAk,10337\r\nwerkzeug/debug/__init__.py,sha256=GDFrgOvwQ5wXQ2q5EeVBKh6JUQS8zLFFkgY6UOWeKrs,13126\r\nwerkzeug/debug/console.py,sha256=B7uAu9Rk60siDnGlEt-A_q1ZR4zCtmxx5itg3X-BOxo,5599\r\nwerkzeug/debug/repr.py,sha256=NaoB89aHb0vuvdSWels-GWdeGDZp76uE4uSNZPX1jAM,9354\r\nwerkzeug/debug/tbtools.py,sha256=L5P5TkGEHc_Bc5duNosP6D4CNe7ieTo1oiPX8nKQdek,18402\r\nwerkzeug/debug/shared/FONT_LICENSE,sha256=LwAVEI1oYnvXiNMT9SnCH_TaLCxCpeHziDrMg0gPkAI,4673\r\nwerkzeug/debug/shared/console.png,sha256=bxax6RXXlvOij_KeqvSNX0ojJf83YbnZ7my-3Gx9w2A,507\r\nwerkzeug/debug/shared/debugger.js,sha256=PEMBoNuD6fUaNou8Km_ZvVmFcIA3z3k3jSEMWLW-cA0,6187\r\nwerkzeug/debug/shared/jquery.js,sha256=7LkWEzqTdpEfELxcZZlS6wAx5Ff13zZ83lYO2_ujj7g,95957\r\nwerkzeug/debug/shared/less.png,sha256=-4-kNRaXJSONVLahrQKUxMwXGm9R4OnZ9SxDGpHlIR4,191\r\nwerkzeug/debug/shared/more.png,sha256=GngN7CioHQoV58rH6ojnkYi8c_qED2Aka5FO5UXrReY,200\r\nwerkzeug/debug/shared/source.png,sha256=RoGcBTE4CyCB85GBuDGTFlAnUqxwTBiIfDqW15EpnUQ,818\r\nwerkzeug/debug/shared/style.css,sha256=7x1s8olZO1XHalqD4M9MWn9vRqQkA635S9_6zRoe220,6231\r\nwerkzeug/debug/shared/ubuntu.ttf,sha256=1eaHFyepmy4FyDvjLVzpITrGEBu_CZYY94jE0nED1c0,70220\r\nwerkzeug/_reloader.pyc,,\r\nwerkzeug/filesystem.pyc,,\r\nwerkzeug/contrib/testtools.pyc,,\r\nwerkzeug/formparser.pyc,,\r\nwerkzeug/_compat.pyc,,\r\nwerkzeug/posixemulation.pyc,,\r\nwerkzeug/serving.pyc,,\r\nwerkzeug/contrib/__init__.pyc,,\r\nwerkzeug/contrib/iterio.pyc,,\r\nwerkzeug/datastructures.pyc,,\r\nwerkzeug/__init__.pyc,,\r\nwerkzeug/contrib/limiter.pyc,,\r\nwerkzeug/debug/tbtools.pyc,,\r\nwerkzeug/contrib/sessions.pyc,,\r\nwerkzeug/local.pyc,,\r\nwerkzeug/utils.pyc,,\r\nwerkzeug/contrib/lint.pyc,,\r\nwerkzeug/security.pyc,,\r\nwerkzeug/contrib/cache.pyc,,\r\nwerkzeug/contrib/securecookie.pyc,,\r\nwerkzeug/script.pyc,,\r\nwerkzeug/routing.pyc,,\r\nwerkzeug/wrappers.pyc,,\r\nwerkzeug/contrib/jsrouting.pyc,,\r\nwerkzeug/contrib/fixers.pyc,,\r\nwerkzeug/contrib/profiler.pyc,,\r\nwerkzeug/debug/console.pyc,,\r\nwerkzeug/debug/__init__.pyc,,\r\nwerkzeug/wsgi.pyc,,\r\nwerkzeug/test.pyc,,\r\nwerkzeug/http.pyc,,\r\nwerkzeug/urls.pyc,,\r\nwerkzeug/useragents.pyc,,\r\nwerkzeug/_internal.pyc,,\r\nwerkzeug/contrib/wrappers.pyc,,\r\nwerkzeug/exceptions.pyc,,\r\nwerkzeug/contrib/atom.pyc,,\r\nwerkzeug/testapp.pyc,,\r\nwerkzeug/debug/repr.pyc,,\r\n"
  },
  {
    "path": "lib/Werkzeug-0.11.dist-info/WHEEL",
    "content": "Wheel-Version: 1.0\nGenerator: bdist_wheel (0.26.0)\nRoot-Is-Purelib: true\nTag: py2-none-any\nTag: py3-none-any\n\n"
  },
  {
    "path": "lib/Werkzeug-0.11.dist-info/metadata.json",
    "content": "{\"generator\": \"bdist_wheel (0.26.0)\", \"summary\": \"The Swiss Army knife of Python web development\", \"classifiers\": [\"Development Status :: 5 - Production/Stable\", \"Environment :: Web Environment\", \"Intended Audience :: Developers\", \"License :: OSI Approved :: BSD License\", \"Operating System :: OS Independent\", \"Programming Language :: Python\", \"Programming Language :: Python :: 2\", \"Programming Language :: Python :: 2.6\", \"Programming Language :: Python :: 2.7\", \"Programming Language :: Python :: 3\", \"Programming Language :: Python :: 3.3\", \"Programming Language :: Python :: 3.4\", \"Programming Language :: Python :: 3.5\", \"Topic :: Internet :: WWW/HTTP :: Dynamic Content\", \"Topic :: Software Development :: Libraries :: Python Modules\"], \"extensions\": {\"python.details\": {\"project_urls\": {\"Home\": \"http://werkzeug.pocoo.org/\"}, \"contacts\": [{\"email\": \"armin.ronacher@active-4.com\", \"name\": \"Armin Ronacher\", \"role\": \"author\"}], \"document_names\": {\"description\": \"DESCRIPTION.rst\"}}}, \"license\": \"BSD\", \"metadata_version\": \"2.0\", \"name\": \"Werkzeug\", \"platform\": \"any\", \"version\": \"0.11\"}"
  },
  {
    "path": "lib/Werkzeug-0.11.dist-info/top_level.txt",
    "content": "werkzeug\n"
  },
  {
    "path": "lib/flask/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    flask\n    ~~~~~\n\n    A microframework based on Werkzeug.  It's extensively documented\n    and follows best practice patterns.\n\n    :copyright: (c) 2011 by Armin Ronacher.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\n\n__version__ = '0.10'\n\n# utilities we import from Werkzeug and Jinja2 that are unused\n# in the module but are exported as public interface.\nfrom werkzeug.exceptions import abort\nfrom werkzeug.utils import redirect\nfrom jinja2 import Markup, escape\n\nfrom .app import Flask, Request, Response\nfrom .config import Config\nfrom .helpers import url_for, flash, send_file, send_from_directory, \\\n    get_flashed_messages, get_template_attribute, make_response, safe_join, \\\n    stream_with_context\nfrom .globals import current_app, g, request, session, _request_ctx_stack, \\\n     _app_ctx_stack\nfrom .ctx import has_request_context, has_app_context, \\\n     after_this_request, copy_current_request_context\nfrom .module import Module\nfrom .blueprints import Blueprint\nfrom .templating import render_template, render_template_string\n\n# the signals\nfrom .signals import signals_available, template_rendered, request_started, \\\n     request_finished, got_request_exception, request_tearing_down, \\\n     appcontext_tearing_down, appcontext_pushed, \\\n     appcontext_popped, message_flashed\n\n# We're not exposing the actual json module but a convenient wrapper around\n# it.\nfrom . import json\n\n# This was the only thing that flask used to export at one point and it had\n# a more generic name.\njsonify = json.jsonify\n\n# backwards compat, goes away in 1.0\nfrom .sessions import SecureCookieSession as Session\njson_available = True\n"
  },
  {
    "path": "lib/flask/_compat.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    flask._compat\n    ~~~~~~~~~~~~~\n\n    Some py2/py3 compatibility support based on a stripped down\n    version of six so we don't have to depend on a specific version\n    of it.\n\n    :copyright: (c) 2013 by Armin Ronacher.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nimport sys\n\nPY2 = sys.version_info[0] == 2\n_identity = lambda x: x\n\n\nif not PY2:\n    text_type = str\n    string_types = (str,)\n    integer_types = (int, )\n\n    iterkeys = lambda d: iter(d.keys())\n    itervalues = lambda d: iter(d.values())\n    iteritems = lambda d: iter(d.items())\n\n    from io import StringIO\n\n    def reraise(tp, value, tb=None):\n        if value.__traceback__ is not tb:\n            raise value.with_traceback(tb)\n        raise value\n\n    implements_to_string = _identity\n\nelse:\n    text_type = unicode\n    string_types = (str, unicode)\n    integer_types = (int, long)\n\n    iterkeys = lambda d: d.iterkeys()\n    itervalues = lambda d: d.itervalues()\n    iteritems = lambda d: d.iteritems()\n\n    from cStringIO import StringIO\n\n    exec('def reraise(tp, value, tb=None):\\n raise tp, value, tb')\n\n    def implements_to_string(cls):\n        cls.__unicode__ = cls.__str__\n        cls.__str__ = lambda x: x.__unicode__().encode('utf-8')\n        return cls\n\n\ndef with_metaclass(meta, *bases):\n    # This requires a bit of explanation: the basic idea is to make a\n    # dummy metaclass for one level of class instantiation that replaces\n    # itself with the actual metaclass.  Because of internal type checks\n    # we also need to make sure that we downgrade the custom metaclass\n    # for one level to something closer to type (that's why __call__ and\n    # __init__ comes back from type etc.).\n    #\n    # This has the advantage over six.with_metaclass in that it does not\n    # introduce dummy classes into the final MRO.\n    class metaclass(meta):\n        __call__ = type.__call__\n        __init__ = type.__init__\n        def __new__(cls, name, this_bases, d):\n            if this_bases is None:\n                return type.__new__(cls, name, (), d)\n            return meta(name, bases, d)\n    return metaclass('temporary_class', None, {})\n"
  },
  {
    "path": "lib/flask/app.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    flask.app\n    ~~~~~~~~~\n\n    This module implements the central WSGI application object.\n\n    :copyright: (c) 2011 by Armin Ronacher.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\n\nimport os\nimport sys\nfrom threading import Lock\nfrom datetime import timedelta\nfrom itertools import chain\nfrom functools import update_wrapper\n\nfrom werkzeug.datastructures import ImmutableDict\nfrom werkzeug.routing import Map, Rule, RequestRedirect, BuildError\nfrom werkzeug.exceptions import HTTPException, InternalServerError, \\\n     MethodNotAllowed, BadRequest\n\nfrom .helpers import _PackageBoundObject, url_for, get_flashed_messages, \\\n     locked_cached_property, _endpoint_from_view_func, find_package\nfrom . import json\nfrom .wrappers import Request, Response\nfrom .config import ConfigAttribute, Config\nfrom .ctx import RequestContext, AppContext, _AppCtxGlobals\nfrom .globals import _request_ctx_stack, request, session, g\nfrom .sessions import SecureCookieSessionInterface\nfrom .module import blueprint_is_module\nfrom .templating import DispatchingJinjaLoader, Environment, \\\n     _default_template_ctx_processor\nfrom .signals import request_started, request_finished, got_request_exception, \\\n     request_tearing_down, appcontext_tearing_down\nfrom ._compat import reraise, string_types, text_type, integer_types\n\n# a lock used for logger initialization\n_logger_lock = Lock()\n\n\ndef _make_timedelta(value):\n    if not isinstance(value, timedelta):\n        return timedelta(seconds=value)\n    return value\n\n\ndef setupmethod(f):\n    \"\"\"Wraps a method so that it performs a check in debug mode if the\n    first request was already handled.\n    \"\"\"\n    def wrapper_func(self, *args, **kwargs):\n        if self.debug and self._got_first_request:\n            raise AssertionError('A setup function was called after the '\n                'first request was handled.  This usually indicates a bug '\n                'in the application where a module was not imported '\n                'and decorators or other functionality was called too late.\\n'\n                'To fix this make sure to import all your view modules, '\n                'database models and everything related at a central place '\n                'before the application starts serving requests.')\n        return f(self, *args, **kwargs)\n    return update_wrapper(wrapper_func, f)\n\n\nclass Flask(_PackageBoundObject):\n    \"\"\"The flask object implements a WSGI application and acts as the central\n    object.  It is passed the name of the module or package of the\n    application.  Once it is created it will act as a central registry for\n    the view functions, the URL rules, template configuration and much more.\n\n    The name of the package is used to resolve resources from inside the\n    package or the folder the module is contained in depending on if the\n    package parameter resolves to an actual python package (a folder with\n    an `__init__.py` file inside) or a standard module (just a `.py` file).\n\n    For more information about resource loading, see :func:`open_resource`.\n\n    Usually you create a :class:`Flask` instance in your main module or\n    in the `__init__.py` file of your package like this::\n\n        from flask import Flask\n        app = Flask(__name__)\n\n    .. admonition:: About the First Parameter\n\n        The idea of the first parameter is to give Flask an idea what\n        belongs to your application.  This name is used to find resources\n        on the file system, can be used by extensions to improve debugging\n        information and a lot more.\n\n        So it's important what you provide there.  If you are using a single\n        module, `__name__` is always the correct value.  If you however are\n        using a package, it's usually recommended to hardcode the name of\n        your package there.\n\n        For example if your application is defined in `yourapplication/app.py`\n        you should create it with one of the two versions below::\n\n            app = Flask('yourapplication')\n            app = Flask(__name__.split('.')[0])\n\n        Why is that?  The application will work even with `__name__`, thanks\n        to how resources are looked up.  However it will make debugging more\n        painful.  Certain extensions can make assumptions based on the\n        import name of your application.  For example the Flask-SQLAlchemy\n        extension will look for the code in your application that triggered\n        an SQL query in debug mode.  If the import name is not properly set\n        up, that debugging information is lost.  (For example it would only\n        pick up SQL queries in `yourapplication.app` and not\n        `yourapplication.views.frontend`)\n\n    .. versionadded:: 0.7\n       The `static_url_path`, `static_folder`, and `template_folder`\n       parameters were added.\n\n    .. versionadded:: 0.8\n       The `instance_path` and `instance_relative_config` parameters were\n       added.\n\n    :param import_name: the name of the application package\n    :param static_url_path: can be used to specify a different path for the\n                            static files on the web.  Defaults to the name\n                            of the `static_folder` folder.\n    :param static_folder: the folder with static files that should be served\n                          at `static_url_path`.  Defaults to the ``'static'``\n                          folder in the root path of the application.\n    :param template_folder: the folder that contains the templates that should\n                            be used by the application.  Defaults to\n                            ``'templates'`` folder in the root path of the\n                            application.\n    :param instance_path: An alternative instance path for the application.\n                          By default the folder ``'instance'`` next to the\n                          package or module is assumed to be the instance\n                          path.\n    :param instance_relative_config: if set to `True` relative filenames\n                                     for loading the config are assumed to\n                                     be relative to the instance path instead\n                                     of the application root.\n    \"\"\"\n\n    #: The class that is used for request objects.  See :class:`~flask.Request`\n    #: for more information.\n    request_class = Request\n\n    #: The class that is used for response objects.  See\n    #: :class:`~flask.Response` for more information.\n    response_class = Response\n\n    #: The class that is used for the :data:`~flask.g` instance.\n    #:\n    #: Example use cases for a custom class:\n    #:\n    #: 1. Store arbitrary attributes on flask.g.\n    #: 2. Add a property for lazy per-request database connectors.\n    #: 3. Return None instead of AttributeError on expected attributes.\n    #: 4. Raise exception if an unexpected attr is set, a \"controlled\" flask.g.\n    #:\n    #: In Flask 0.9 this property was called `request_globals_class` but it\n    #: was changed in 0.10 to :attr:`app_ctx_globals_class` because the\n    #: flask.g object is not application context scoped.\n    #:\n    #: .. versionadded:: 0.10\n    app_ctx_globals_class = _AppCtxGlobals\n\n    # Backwards compatibility support\n    def _get_request_globals_class(self):\n        return self.app_ctx_globals_class\n    def _set_request_globals_class(self, value):\n        from warnings import warn\n        warn(DeprecationWarning('request_globals_class attribute is now '\n                                'called app_ctx_globals_class'))\n        self.app_ctx_globals_class = value\n    request_globals_class = property(_get_request_globals_class,\n                                     _set_request_globals_class)\n    del _get_request_globals_class, _set_request_globals_class\n\n    #: The debug flag.  Set this to `True` to enable debugging of the\n    #: application.  In debug mode the debugger will kick in when an unhandled\n    #: exception occurs and the integrated server will automatically reload\n    #: the application if changes in the code are detected.\n    #:\n    #: This attribute can also be configured from the config with the `DEBUG`\n    #: configuration key.  Defaults to `False`.\n    debug = ConfigAttribute('DEBUG')\n\n    #: The testing flag.  Set this to `True` to enable the test mode of\n    #: Flask extensions (and in the future probably also Flask itself).\n    #: For example this might activate unittest helpers that have an\n    #: additional runtime cost which should not be enabled by default.\n    #:\n    #: If this is enabled and PROPAGATE_EXCEPTIONS is not changed from the\n    #: default it's implicitly enabled.\n    #:\n    #: This attribute can also be configured from the config with the\n    #: `TESTING` configuration key.  Defaults to `False`.\n    testing = ConfigAttribute('TESTING')\n\n    #: If a secret key is set, cryptographic components can use this to\n    #: sign cookies and other things.  Set this to a complex random value\n    #: when you want to use the secure cookie for instance.\n    #:\n    #: This attribute can also be configured from the config with the\n    #: `SECRET_KEY` configuration key.  Defaults to `None`.\n    secret_key = ConfigAttribute('SECRET_KEY')\n\n    #: The secure cookie uses this for the name of the session cookie.\n    #:\n    #: This attribute can also be configured from the config with the\n    #: `SESSION_COOKIE_NAME` configuration key.  Defaults to ``'session'``\n    session_cookie_name = ConfigAttribute('SESSION_COOKIE_NAME')\n\n    #: A :class:`~datetime.timedelta` which is used to set the expiration\n    #: date of a permanent session.  The default is 31 days which makes a\n    #: permanent session survive for roughly one month.\n    #:\n    #: This attribute can also be configured from the config with the\n    #: `PERMANENT_SESSION_LIFETIME` configuration key.  Defaults to\n    #: ``timedelta(days=31)``\n    permanent_session_lifetime = ConfigAttribute('PERMANENT_SESSION_LIFETIME',\n        get_converter=_make_timedelta)\n\n    #: Enable this if you want to use the X-Sendfile feature.  Keep in\n    #: mind that the server has to support this.  This only affects files\n    #: sent with the :func:`send_file` method.\n    #:\n    #: .. versionadded:: 0.2\n    #:\n    #: This attribute can also be configured from the config with the\n    #: `USE_X_SENDFILE` configuration key.  Defaults to `False`.\n    use_x_sendfile = ConfigAttribute('USE_X_SENDFILE')\n\n    #: The name of the logger to use.  By default the logger name is the\n    #: package name passed to the constructor.\n    #:\n    #: .. versionadded:: 0.4\n    logger_name = ConfigAttribute('LOGGER_NAME')\n\n    #: Enable the deprecated module support?  This is active by default\n    #: in 0.7 but will be changed to False in 0.8.  With Flask 1.0 modules\n    #: will be removed in favor of Blueprints\n    enable_modules = True\n\n    #: The logging format used for the debug logger.  This is only used when\n    #: the application is in debug mode, otherwise the attached logging\n    #: handler does the formatting.\n    #:\n    #: .. versionadded:: 0.3\n    debug_log_format = (\n        '-' * 80 + '\\n' +\n        '%(levelname)s in %(module)s [%(pathname)s:%(lineno)d]:\\n' +\n        '%(message)s\\n' +\n        '-' * 80\n    )\n\n    #: The JSON encoder class to use.  Defaults to :class:`~flask.json.JSONEncoder`.\n    #:\n    #: .. versionadded:: 0.10\n    json_encoder = json.JSONEncoder\n\n    #: The JSON decoder class to use.  Defaults to :class:`~flask.json.JSONDecoder`.\n    #:\n    #: .. versionadded:: 0.10\n    json_decoder = json.JSONDecoder\n\n    #: Options that are passed directly to the Jinja2 environment.\n    jinja_options = ImmutableDict(\n        extensions=['jinja2.ext.autoescape', 'jinja2.ext.with_']\n    )\n\n    #: Default configuration parameters.\n    default_config = ImmutableDict({\n        'DEBUG':                                False,\n        'TESTING':                              False,\n        'PROPAGATE_EXCEPTIONS':                 None,\n        'PRESERVE_CONTEXT_ON_EXCEPTION':        None,\n        'SECRET_KEY':                           None,\n        'PERMANENT_SESSION_LIFETIME':           timedelta(days=31),\n        'USE_X_SENDFILE':                       False,\n        'LOGGER_NAME':                          None,\n        'SERVER_NAME':                          None,\n        'APPLICATION_ROOT':                     None,\n        'SESSION_COOKIE_NAME':                  'session',\n        'SESSION_COOKIE_DOMAIN':                None,\n        'SESSION_COOKIE_PATH':                  None,\n        'SESSION_COOKIE_HTTPONLY':              True,\n        'SESSION_COOKIE_SECURE':                False,\n        'MAX_CONTENT_LENGTH':                   None,\n        'SEND_FILE_MAX_AGE_DEFAULT':            12 * 60 * 60, # 12 hours\n        'TRAP_BAD_REQUEST_ERRORS':              False,\n        'TRAP_HTTP_EXCEPTIONS':                 False,\n        'PREFERRED_URL_SCHEME':                 'http',\n        'JSON_AS_ASCII':                        True,\n        'JSON_SORT_KEYS':                       True,\n        'JSONIFY_PRETTYPRINT_REGULAR':          True,\n    })\n\n    #: The rule object to use for URL rules created.  This is used by\n    #: :meth:`add_url_rule`.  Defaults to :class:`werkzeug.routing.Rule`.\n    #:\n    #: .. versionadded:: 0.7\n    url_rule_class = Rule\n\n    #: the test client that is used with when `test_client` is used.\n    #:\n    #: .. versionadded:: 0.7\n    test_client_class = None\n\n    #: the session interface to use.  By default an instance of\n    #: :class:`~flask.sessions.SecureCookieSessionInterface` is used here.\n    #:\n    #: .. versionadded:: 0.8\n    session_interface = SecureCookieSessionInterface()\n\n    def __init__(self, import_name, static_path=None, static_url_path=None,\n                 static_folder='static', template_folder='templates',\n                 instance_path=None, instance_relative_config=False):\n        _PackageBoundObject.__init__(self, import_name,\n                                     template_folder=template_folder)\n        if static_path is not None:\n            from warnings import warn\n            warn(DeprecationWarning('static_path is now called '\n                                    'static_url_path'), stacklevel=2)\n            static_url_path = static_path\n\n        if static_url_path is not None:\n            self.static_url_path = static_url_path\n        if static_folder is not None:\n            self.static_folder = static_folder\n        if instance_path is None:\n            instance_path = self.auto_find_instance_path()\n        elif not os.path.isabs(instance_path):\n            raise ValueError('If an instance path is provided it must be '\n                             'absolute.  A relative path was given instead.')\n\n        #: Holds the path to the instance folder.\n        #:\n        #: .. versionadded:: 0.8\n        self.instance_path = instance_path\n\n        #: The configuration dictionary as :class:`Config`.  This behaves\n        #: exactly like a regular dictionary but supports additional methods\n        #: to load a config from files.\n        self.config = self.make_config(instance_relative_config)\n\n        # Prepare the deferred setup of the logger.\n        self._logger = None\n        self.logger_name = self.import_name\n\n        #: A dictionary of all view functions registered.  The keys will\n        #: be function names which are also used to generate URLs and\n        #: the values are the function objects themselves.\n        #: To register a view function, use the :meth:`route` decorator.\n        self.view_functions = {}\n\n        # support for the now deprecated `error_handlers` attribute.  The\n        # :attr:`error_handler_spec` shall be used now.\n        self._error_handlers = {}\n\n        #: A dictionary of all registered error handlers.  The key is `None`\n        #: for error handlers active on the application, otherwise the key is\n        #: the name of the blueprint.  Each key points to another dictionary\n        #: where they key is the status code of the http exception.  The\n        #: special key `None` points to a list of tuples where the first item\n        #: is the class for the instance check and the second the error handler\n        #: function.\n        #:\n        #: To register a error handler, use the :meth:`errorhandler`\n        #: decorator.\n        self.error_handler_spec = {None: self._error_handlers}\n\n        #: A list of functions that are called when :meth:`url_for` raises a\n        #: :exc:`~werkzeug.routing.BuildError`.  Each function registered here\n        #: is called with `error`, `endpoint` and `values`.  If a function\n        #: returns `None` or raises a `BuildError` the next function is\n        #: tried.\n        #:\n        #: .. versionadded:: 0.9\n        self.url_build_error_handlers = []\n\n        #: A dictionary with lists of functions that should be called at the\n        #: beginning of the request.  The key of the dictionary is the name of\n        #: the blueprint this function is active for, `None` for all requests.\n        #: This can for example be used to open database connections or\n        #: getting hold of the currently logged in user.  To register a\n        #: function here, use the :meth:`before_request` decorator.\n        self.before_request_funcs = {}\n\n        #: A lists of functions that should be called at the beginning of the\n        #: first request to this instance.  To register a function here, use\n        #: the :meth:`before_first_request` decorator.\n        #:\n        #: .. versionadded:: 0.8\n        self.before_first_request_funcs = []\n\n        #: A dictionary with lists of functions that should be called after\n        #: each request.  The key of the dictionary is the name of the blueprint\n        #: this function is active for, `None` for all requests.  This can for\n        #: example be used to open database connections or getting hold of the\n        #: currently logged in user.  To register a function here, use the\n        #: :meth:`after_request` decorator.\n        self.after_request_funcs = {}\n\n        #: A dictionary with lists of functions that are called after\n        #: each request, even if an exception has occurred. The key of the\n        #: dictionary is the name of the blueprint this function is active for,\n        #: `None` for all requests. These functions are not allowed to modify\n        #: the request, and their return values are ignored. If an exception\n        #: occurred while processing the request, it gets passed to each\n        #: teardown_request function. To register a function here, use the\n        #: :meth:`teardown_request` decorator.\n        #:\n        #: .. versionadded:: 0.7\n        self.teardown_request_funcs = {}\n\n        #: A list of functions that are called when the application context\n        #: is destroyed.  Since the application context is also torn down\n        #: if the request ends this is the place to store code that disconnects\n        #: from databases.\n        #:\n        #: .. versionadded:: 0.9\n        self.teardown_appcontext_funcs = []\n\n        #: A dictionary with lists of functions that can be used as URL\n        #: value processor functions.  Whenever a URL is built these functions\n        #: are called to modify the dictionary of values in place.  The key\n        #: `None` here is used for application wide\n        #: callbacks, otherwise the key is the name of the blueprint.\n        #: Each of these functions has the chance to modify the dictionary\n        #:\n        #: .. versionadded:: 0.7\n        self.url_value_preprocessors = {}\n\n        #: A dictionary with lists of functions that can be used as URL value\n        #: preprocessors.  The key `None` here is used for application wide\n        #: callbacks, otherwise the key is the name of the blueprint.\n        #: Each of these functions has the chance to modify the dictionary\n        #: of URL values before they are used as the keyword arguments of the\n        #: view function.  For each function registered this one should also\n        #: provide a :meth:`url_defaults` function that adds the parameters\n        #: automatically again that were removed that way.\n        #:\n        #: .. versionadded:: 0.7\n        self.url_default_functions = {}\n\n        #: A dictionary with list of functions that are called without argument\n        #: to populate the template context.  The key of the dictionary is the\n        #: name of the blueprint this function is active for, `None` for all\n        #: requests.  Each returns a dictionary that the template context is\n        #: updated with.  To register a function here, use the\n        #: :meth:`context_processor` decorator.\n        self.template_context_processors = {\n            None: [_default_template_ctx_processor]\n        }\n\n        #: all the attached blueprints in a dictionary by name.  Blueprints\n        #: can be attached multiple times so this dictionary does not tell\n        #: you how often they got attached.\n        #:\n        #: .. versionadded:: 0.7\n        self.blueprints = {}\n\n        #: a place where extensions can store application specific state.  For\n        #: example this is where an extension could store database engines and\n        #: similar things.  For backwards compatibility extensions should register\n        #: themselves like this::\n        #:\n        #:      if not hasattr(app, 'extensions'):\n        #:          app.extensions = {}\n        #:      app.extensions['extensionname'] = SomeObject()\n        #:\n        #: The key must match the name of the `flaskext` module.  For example in\n        #: case of a \"Flask-Foo\" extension in `flaskext.foo`, the key would be\n        #: ``'foo'``.\n        #:\n        #: .. versionadded:: 0.7\n        self.extensions = {}\n\n        #: The :class:`~werkzeug.routing.Map` for this instance.  You can use\n        #: this to change the routing converters after the class was created\n        #: but before any routes are connected.  Example::\n        #:\n        #:    from werkzeug.routing import BaseConverter\n        #:\n        #:    class ListConverter(BaseConverter):\n        #:        def to_python(self, value):\n        #:            return value.split(',')\n        #:        def to_url(self, values):\n        #:            return ','.join(BaseConverter.to_url(value)\n        #:                            for value in values)\n        #:\n        #:    app = Flask(__name__)\n        #:    app.url_map.converters['list'] = ListConverter\n        self.url_map = Map()\n\n        # tracks internally if the application already handled at least one\n        # request.\n        self._got_first_request = False\n        self._before_request_lock = Lock()\n\n        # register the static folder for the application.  Do that even\n        # if the folder does not exist.  First of all it might be created\n        # while the server is running (usually happens during development)\n        # but also because google appengine stores static files somewhere\n        # else when mapped with the .yml file.\n        if self.has_static_folder:\n            self.add_url_rule(self.static_url_path + '/<path:filename>',\n                              endpoint='static',\n                              view_func=self.send_static_file)\n\n    def _get_error_handlers(self):\n        from warnings import warn\n        warn(DeprecationWarning('error_handlers is deprecated, use the '\n            'new error_handler_spec attribute instead.'), stacklevel=1)\n        return self._error_handlers\n    def _set_error_handlers(self, value):\n        self._error_handlers = value\n        self.error_handler_spec[None] = value\n    error_handlers = property(_get_error_handlers, _set_error_handlers)\n    del _get_error_handlers, _set_error_handlers\n\n    @locked_cached_property\n    def name(self):\n        \"\"\"The name of the application.  This is usually the import name\n        with the difference that it's guessed from the run file if the\n        import name is main.  This name is used as a display name when\n        Flask needs the name of the application.  It can be set and overridden\n        to change the value.\n\n        .. versionadded:: 0.8\n        \"\"\"\n        if self.import_name == '__main__':\n            fn = getattr(sys.modules['__main__'], '__file__', None)\n            if fn is None:\n                return '__main__'\n            return os.path.splitext(os.path.basename(fn))[0]\n        return self.import_name\n\n    @property\n    def propagate_exceptions(self):\n        \"\"\"Returns the value of the `PROPAGATE_EXCEPTIONS` configuration\n        value in case it's set, otherwise a sensible default is returned.\n\n        .. versionadded:: 0.7\n        \"\"\"\n        rv = self.config['PROPAGATE_EXCEPTIONS']\n        if rv is not None:\n            return rv\n        return self.testing or self.debug\n\n    @property\n    def preserve_context_on_exception(self):\n        \"\"\"Returns the value of the `PRESERVE_CONTEXT_ON_EXCEPTION`\n        configuration value in case it's set, otherwise a sensible default\n        is returned.\n\n        .. versionadded:: 0.7\n        \"\"\"\n        rv = self.config['PRESERVE_CONTEXT_ON_EXCEPTION']\n        if rv is not None:\n            return rv\n        return self.debug\n\n    @property\n    def logger(self):\n        \"\"\"A :class:`logging.Logger` object for this application.  The\n        default configuration is to log to stderr if the application is\n        in debug mode.  This logger can be used to (surprise) log messages.\n        Here some examples::\n\n            app.logger.debug('A value for debugging')\n            app.logger.warning('A warning occurred (%d apples)', 42)\n            app.logger.error('An error occurred')\n\n        .. versionadded:: 0.3\n        \"\"\"\n        if self._logger and self._logger.name == self.logger_name:\n            return self._logger\n        with _logger_lock:\n            if self._logger and self._logger.name == self.logger_name:\n                return self._logger\n            from flask.logging import create_logger\n            self._logger = rv = create_logger(self)\n            return rv\n\n    @locked_cached_property\n    def jinja_env(self):\n        \"\"\"The Jinja2 environment used to load templates.\"\"\"\n        return self.create_jinja_environment()\n\n    @property\n    def got_first_request(self):\n        \"\"\"This attribute is set to `True` if the application started\n        handling the first request.\n\n        .. versionadded:: 0.8\n        \"\"\"\n        return self._got_first_request\n\n    def make_config(self, instance_relative=False):\n        \"\"\"Used to create the config attribute by the Flask constructor.\n        The `instance_relative` parameter is passed in from the constructor\n        of Flask (there named `instance_relative_config`) and indicates if\n        the config should be relative to the instance path or the root path\n        of the application.\n\n        .. versionadded:: 0.8\n        \"\"\"\n        root_path = self.root_path\n        if instance_relative:\n            root_path = self.instance_path\n        return Config(root_path, self.default_config)\n\n    def auto_find_instance_path(self):\n        \"\"\"Tries to locate the instance path if it was not provided to the\n        constructor of the application class.  It will basically calculate\n        the path to a folder named ``instance`` next to your main file or\n        the package.\n\n        .. versionadded:: 0.8\n        \"\"\"\n        prefix, package_path = find_package(self.import_name)\n        if prefix is None:\n            return os.path.join(package_path, 'instance')\n        return os.path.join(prefix, 'var', self.name + '-instance')\n\n    def open_instance_resource(self, resource, mode='rb'):\n        \"\"\"Opens a resource from the application's instance folder\n        (:attr:`instance_path`).  Otherwise works like\n        :meth:`open_resource`.  Instance resources can also be opened for\n        writing.\n\n        :param resource: the name of the resource.  To access resources within\n                         subfolders use forward slashes as separator.\n        :param mode: resource file opening mode, default is 'rb'.\n        \"\"\"\n        return open(os.path.join(self.instance_path, resource), mode)\n\n    def create_jinja_environment(self):\n        \"\"\"Creates the Jinja2 environment based on :attr:`jinja_options`\n        and :meth:`select_jinja_autoescape`.  Since 0.7 this also adds\n        the Jinja2 globals and filters after initialization.  Override\n        this function to customize the behavior.\n\n        .. versionadded:: 0.5\n        \"\"\"\n        options = dict(self.jinja_options)\n        if 'autoescape' not in options:\n            options['autoescape'] = self.select_jinja_autoescape\n        rv = Environment(self, **options)\n        rv.globals.update(\n            url_for=url_for,\n            get_flashed_messages=get_flashed_messages,\n            config=self.config,\n            # request, session and g are normally added with the\n            # context processor for efficiency reasons but for imported\n            # templates we also want the proxies in there.\n            request=request,\n            session=session,\n            g=g\n        )\n        rv.filters['tojson'] = json.tojson_filter\n        return rv\n\n    def create_global_jinja_loader(self):\n        \"\"\"Creates the loader for the Jinja2 environment.  Can be used to\n        override just the loader and keeping the rest unchanged.  It's\n        discouraged to override this function.  Instead one should override\n        the :meth:`jinja_loader` function instead.\n\n        The global loader dispatches between the loaders of the application\n        and the individual blueprints.\n\n        .. versionadded:: 0.7\n        \"\"\"\n        return DispatchingJinjaLoader(self)\n\n    def init_jinja_globals(self):\n        \"\"\"Deprecated.  Used to initialize the Jinja2 globals.\n\n        .. versionadded:: 0.5\n        .. versionchanged:: 0.7\n           This method is deprecated with 0.7.  Override\n           :meth:`create_jinja_environment` instead.\n        \"\"\"\n\n    def select_jinja_autoescape(self, filename):\n        \"\"\"Returns `True` if autoescaping should be active for the given\n        template name.\n\n        .. versionadded:: 0.5\n        \"\"\"\n        if filename is None:\n            return False\n        return filename.endswith(('.html', '.htm', '.xml', '.xhtml'))\n\n    def update_template_context(self, context):\n        \"\"\"Update the template context with some commonly used variables.\n        This injects request, session, config and g into the template\n        context as well as everything template context processors want\n        to inject.  Note that the as of Flask 0.6, the original values\n        in the context will not be overridden if a context processor\n        decides to return a value with the same key.\n\n        :param context: the context as a dictionary that is updated in place\n                        to add extra variables.\n        \"\"\"\n        funcs = self.template_context_processors[None]\n        reqctx = _request_ctx_stack.top\n        if reqctx is not None:\n            bp = reqctx.request.blueprint\n            if bp is not None and bp in self.template_context_processors:\n                funcs = chain(funcs, self.template_context_processors[bp])\n        orig_ctx = context.copy()\n        for func in funcs:\n            context.update(func())\n        # make sure the original values win.  This makes it possible to\n        # easier add new variables in context processors without breaking\n        # existing views.\n        context.update(orig_ctx)\n\n    def run(self, host=None, port=None, debug=None, **options):\n        \"\"\"Runs the application on a local development server.  If the\n        :attr:`debug` flag is set the server will automatically reload\n        for code changes and show a debugger in case an exception happened.\n\n        If you want to run the application in debug mode, but disable the\n        code execution on the interactive debugger, you can pass\n        ``use_evalex=False`` as parameter.  This will keep the debugger's\n        traceback screen active, but disable code execution.\n\n        .. admonition:: Keep in Mind\n\n           Flask will suppress any server error with a generic error page\n           unless it is in debug mode.  As such to enable just the\n           interactive debugger without the code reloading, you have to\n           invoke :meth:`run` with ``debug=True`` and ``use_reloader=False``.\n           Setting ``use_debugger`` to `True` without being in debug mode\n           won't catch any exceptions because there won't be any to\n           catch.\n\n        .. versionchanged:: 0.10\n           The default port is now picked from the ``SERVER_NAME`` variable.\n\n        :param host: the hostname to listen on. Set this to ``'0.0.0.0'`` to\n                     have the server available externally as well. Defaults to\n                     ``'127.0.0.1'``.\n        :param port: the port of the webserver. Defaults to ``5000`` or the\n                     port defined in the ``SERVER_NAME`` config variable if\n                     present.\n        :param debug: if given, enable or disable debug mode.\n                      See :attr:`debug`.\n        :param options: the options to be forwarded to the underlying\n                        Werkzeug server.  See\n                        :func:`werkzeug.serving.run_simple` for more\n                        information.\n        \"\"\"\n        from werkzeug.serving import run_simple\n        if host is None:\n            host = '127.0.0.1'\n        if port is None:\n            server_name = self.config['SERVER_NAME']\n            if server_name and ':' in server_name:\n                port = int(server_name.rsplit(':', 1)[1])\n            else:\n                port = 5000\n        if debug is not None:\n            self.debug = bool(debug)\n        options.setdefault('use_reloader', self.debug)\n        options.setdefault('use_debugger', self.debug)\n        try:\n            run_simple(host, port, self, **options)\n        finally:\n            # reset the first request information if the development server\n            # resetted normally.  This makes it possible to restart the server\n            # without reloader and that stuff from an interactive shell.\n            self._got_first_request = False\n\n    def test_client(self, use_cookies=True):\n        \"\"\"Creates a test client for this application.  For information\n        about unit testing head over to :ref:`testing`.\n\n        Note that if you are testing for assertions or exceptions in your\n        application code, you must set ``app.testing = True`` in order for the\n        exceptions to propagate to the test client.  Otherwise, the exception\n        will be handled by the application (not visible to the test client) and\n        the only indication of an AssertionError or other exception will be a\n        500 status code response to the test client.  See the :attr:`testing`\n        attribute.  For example::\n\n            app.testing = True\n            client = app.test_client()\n\n        The test client can be used in a `with` block to defer the closing down\n        of the context until the end of the `with` block.  This is useful if\n        you want to access the context locals for testing::\n\n            with app.test_client() as c:\n                rv = c.get('/?vodka=42')\n                assert request.args['vodka'] == '42'\n\n        See :class:`~flask.testing.FlaskClient` for more information.\n\n        .. versionchanged:: 0.4\n           added support for `with` block usage for the client.\n\n        .. versionadded:: 0.7\n           The `use_cookies` parameter was added as well as the ability\n           to override the client to be used by setting the\n           :attr:`test_client_class` attribute.\n        \"\"\"\n        cls = self.test_client_class\n        if cls is None:\n            from flask.testing import FlaskClient as cls\n        return cls(self, self.response_class, use_cookies=use_cookies)\n\n    def open_session(self, request):\n        \"\"\"Creates or opens a new session.  Default implementation stores all\n        session data in a signed cookie.  This requires that the\n        :attr:`secret_key` is set.  Instead of overriding this method\n        we recommend replacing the :class:`session_interface`.\n\n        :param request: an instance of :attr:`request_class`.\n        \"\"\"\n        return self.session_interface.open_session(self, request)\n\n    def save_session(self, session, response):\n        \"\"\"Saves the session if it needs updates.  For the default\n        implementation, check :meth:`open_session`.  Instead of overriding this\n        method we recommend replacing the :class:`session_interface`.\n\n        :param session: the session to be saved (a\n                        :class:`~werkzeug.contrib.securecookie.SecureCookie`\n                        object)\n        :param response: an instance of :attr:`response_class`\n        \"\"\"\n        return self.session_interface.save_session(self, session, response)\n\n    def make_null_session(self):\n        \"\"\"Creates a new instance of a missing session.  Instead of overriding\n        this method we recommend replacing the :class:`session_interface`.\n\n        .. versionadded:: 0.7\n        \"\"\"\n        return self.session_interface.make_null_session(self)\n\n    def register_module(self, module, **options):\n        \"\"\"Registers a module with this application.  The keyword argument\n        of this function are the same as the ones for the constructor of the\n        :class:`Module` class and will override the values of the module if\n        provided.\n\n        .. versionchanged:: 0.7\n           The module system was deprecated in favor for the blueprint\n           system.\n        \"\"\"\n        assert blueprint_is_module(module), 'register_module requires ' \\\n            'actual module objects.  Please upgrade to blueprints though.'\n        if not self.enable_modules:\n            raise RuntimeError('Module support was disabled but code '\n                'attempted to register a module named %r' % module)\n        else:\n            from warnings import warn\n            warn(DeprecationWarning('Modules are deprecated.  Upgrade to '\n                'using blueprints.  Have a look into the documentation for '\n                'more information.  If this module was registered by a '\n                'Flask-Extension upgrade the extension or contact the author '\n                'of that extension instead.  (Registered %r)' % module),\n                stacklevel=2)\n\n        self.register_blueprint(module, **options)\n\n    @setupmethod\n    def register_blueprint(self, blueprint, **options):\n        \"\"\"Registers a blueprint on the application.\n\n        .. versionadded:: 0.7\n        \"\"\"\n        first_registration = False\n        if blueprint.name in self.blueprints:\n            assert self.blueprints[blueprint.name] is blueprint, \\\n                'A blueprint\\'s name collision occurred between %r and ' \\\n                '%r.  Both share the same name \"%s\".  Blueprints that ' \\\n                'are created on the fly need unique names.' % \\\n                (blueprint, self.blueprints[blueprint.name], blueprint.name)\n        else:\n            self.blueprints[blueprint.name] = blueprint\n            first_registration = True\n        blueprint.register(self, options, first_registration)\n\n    @setupmethod\n    def add_url_rule(self, rule, endpoint=None, view_func=None, **options):\n        \"\"\"Connects a URL rule.  Works exactly like the :meth:`route`\n        decorator.  If a view_func is provided it will be registered with the\n        endpoint.\n\n        Basically this example::\n\n            @app.route('/')\n            def index():\n                pass\n\n        Is equivalent to the following::\n\n            def index():\n                pass\n            app.add_url_rule('/', 'index', index)\n\n        If the view_func is not provided you will need to connect the endpoint\n        to a view function like so::\n\n            app.view_functions['index'] = index\n\n        Internally :meth:`route` invokes :meth:`add_url_rule` so if you want\n        to customize the behavior via subclassing you only need to change\n        this method.\n\n        For more information refer to :ref:`url-route-registrations`.\n\n        .. versionchanged:: 0.2\n           `view_func` parameter added.\n\n        .. versionchanged:: 0.6\n           `OPTIONS` is added automatically as method.\n\n        :param rule: the URL rule as string\n        :param endpoint: the endpoint for the registered URL rule.  Flask\n                         itself assumes the name of the view function as\n                         endpoint\n        :param view_func: the function to call when serving a request to the\n                          provided endpoint\n        :param options: the options to be forwarded to the underlying\n                        :class:`~werkzeug.routing.Rule` object.  A change\n                        to Werkzeug is handling of method options.  methods\n                        is a list of methods this rule should be limited\n                        to (`GET`, `POST` etc.).  By default a rule\n                        just listens for `GET` (and implicitly `HEAD`).\n                        Starting with Flask 0.6, `OPTIONS` is implicitly\n                        added and handled by the standard request handling.\n        \"\"\"\n        if endpoint is None:\n            endpoint = _endpoint_from_view_func(view_func)\n        options['endpoint'] = endpoint\n        methods = options.pop('methods', None)\n\n        # if the methods are not given and the view_func object knows its\n        # methods we can use that instead.  If neither exists, we go with\n        # a tuple of only `GET` as default.\n        if methods is None:\n            methods = getattr(view_func, 'methods', None) or ('GET',)\n        methods = set(methods)\n\n        # Methods that should always be added\n        required_methods = set(getattr(view_func, 'required_methods', ()))\n\n        # starting with Flask 0.8 the view_func object can disable and\n        # force-enable the automatic options handling.\n        provide_automatic_options = getattr(view_func,\n            'provide_automatic_options', None)\n\n        if provide_automatic_options is None:\n            if 'OPTIONS' not in methods:\n                provide_automatic_options = True\n                required_methods.add('OPTIONS')\n            else:\n                provide_automatic_options = False\n\n        # Add the required methods now.\n        methods |= required_methods\n\n        # due to a werkzeug bug we need to make sure that the defaults are\n        # None if they are an empty dictionary.  This should not be necessary\n        # with Werkzeug 0.7\n        options['defaults'] = options.get('defaults') or None\n\n        rule = self.url_rule_class(rule, methods=methods, **options)\n        rule.provide_automatic_options = provide_automatic_options\n\n        self.url_map.add(rule)\n        if view_func is not None:\n            old_func = self.view_functions.get(endpoint)\n            if old_func is not None and old_func is not view_func:\n                raise AssertionError('View function mapping is overwriting an '\n                                     'existing endpoint function: %s' % endpoint)\n            self.view_functions[endpoint] = view_func\n\n    def route(self, rule, **options):\n        \"\"\"A decorator that is used to register a view function for a\n        given URL rule.  This does the same thing as :meth:`add_url_rule`\n        but is intended for decorator usage::\n\n            @app.route('/')\n            def index():\n                return 'Hello World'\n\n        For more information refer to :ref:`url-route-registrations`.\n\n        :param rule: the URL rule as string\n        :param endpoint: the endpoint for the registered URL rule.  Flask\n                         itself assumes the name of the view function as\n                         endpoint\n        :param options: the options to be forwarded to the underlying\n                        :class:`~werkzeug.routing.Rule` object.  A change\n                        to Werkzeug is handling of method options.  methods\n                        is a list of methods this rule should be limited\n                        to (`GET`, `POST` etc.).  By default a rule\n                        just listens for `GET` (and implicitly `HEAD`).\n                        Starting with Flask 0.6, `OPTIONS` is implicitly\n                        added and handled by the standard request handling.\n        \"\"\"\n        def decorator(f):\n            endpoint = options.pop('endpoint', None)\n            self.add_url_rule(rule, endpoint, f, **options)\n            return f\n        return decorator\n\n    @setupmethod\n    def endpoint(self, endpoint):\n        \"\"\"A decorator to register a function as an endpoint.\n        Example::\n\n            @app.endpoint('example.endpoint')\n            def example():\n                return \"example\"\n\n        :param endpoint: the name of the endpoint\n        \"\"\"\n        def decorator(f):\n            self.view_functions[endpoint] = f\n            return f\n        return decorator\n\n    @setupmethod\n    def errorhandler(self, code_or_exception):\n        \"\"\"A decorator that is used to register a function give a given\n        error code.  Example::\n\n            @app.errorhandler(404)\n            def page_not_found(error):\n                return 'This page does not exist', 404\n\n        You can also register handlers for arbitrary exceptions::\n\n            @app.errorhandler(DatabaseError)\n            def special_exception_handler(error):\n                return 'Database connection failed', 500\n\n        You can also register a function as error handler without using\n        the :meth:`errorhandler` decorator.  The following example is\n        equivalent to the one above::\n\n            def page_not_found(error):\n                return 'This page does not exist', 404\n            app.error_handler_spec[None][404] = page_not_found\n\n        Setting error handlers via assignments to :attr:`error_handler_spec`\n        however is discouraged as it requires fiddling with nested dictionaries\n        and the special case for arbitrary exception types.\n\n        The first `None` refers to the active blueprint.  If the error\n        handler should be application wide `None` shall be used.\n\n        .. versionadded:: 0.7\n           One can now additionally also register custom exception types\n           that do not necessarily have to be a subclass of the\n           :class:`~werkzeug.exceptions.HTTPException` class.\n\n        :param code: the code as integer for the handler\n        \"\"\"\n        def decorator(f):\n            self._register_error_handler(None, code_or_exception, f)\n            return f\n        return decorator\n\n    def register_error_handler(self, code_or_exception, f):\n        \"\"\"Alternative error attach function to the :meth:`errorhandler`\n        decorator that is more straightforward to use for non decorator\n        usage.\n\n        .. versionadded:: 0.7\n        \"\"\"\n        self._register_error_handler(None, code_or_exception, f)\n\n    @setupmethod\n    def _register_error_handler(self, key, code_or_exception, f):\n        if isinstance(code_or_exception, HTTPException):\n            code_or_exception = code_or_exception.code\n        if isinstance(code_or_exception, integer_types):\n            assert code_or_exception != 500 or key is None, \\\n                'It is currently not possible to register a 500 internal ' \\\n                'server error on a per-blueprint level.'\n            self.error_handler_spec.setdefault(key, {})[code_or_exception] = f\n        else:\n            self.error_handler_spec.setdefault(key, {}).setdefault(None, []) \\\n                .append((code_or_exception, f))\n\n    @setupmethod\n    def template_filter(self, name=None):\n        \"\"\"A decorator that is used to register custom template filter.\n        You can specify a name for the filter, otherwise the function\n        name will be used. Example::\n\n          @app.template_filter()\n          def reverse(s):\n              return s[::-1]\n\n        :param name: the optional name of the filter, otherwise the\n                     function name will be used.\n        \"\"\"\n        def decorator(f):\n            self.add_template_filter(f, name=name)\n            return f\n        return decorator\n\n    @setupmethod\n    def add_template_filter(self, f, name=None):\n        \"\"\"Register a custom template filter.  Works exactly like the\n        :meth:`template_filter` decorator.\n\n        :param name: the optional name of the filter, otherwise the\n                     function name will be used.\n        \"\"\"\n        self.jinja_env.filters[name or f.__name__] = f\n\n    @setupmethod\n    def template_test(self, name=None):\n        \"\"\"A decorator that is used to register custom template test.\n        You can specify a name for the test, otherwise the function\n        name will be used. Example::\n\n          @app.template_test()\n          def is_prime(n):\n              if n == 2:\n                  return True\n              for i in range(2, int(math.ceil(math.sqrt(n))) + 1):\n                  if n % i == 0:\n                      return False\n              return True\n\n        .. versionadded:: 0.10\n\n        :param name: the optional name of the test, otherwise the\n                     function name will be used.\n        \"\"\"\n        def decorator(f):\n            self.add_template_test(f, name=name)\n            return f\n        return decorator\n\n    @setupmethod\n    def add_template_test(self, f, name=None):\n        \"\"\"Register a custom template test.  Works exactly like the\n        :meth:`template_test` decorator.\n\n        .. versionadded:: 0.10\n\n        :param name: the optional name of the test, otherwise the\n                     function name will be used.\n        \"\"\"\n        self.jinja_env.tests[name or f.__name__] = f\n\n\n    @setupmethod\n    def template_global(self, name=None):\n        \"\"\"A decorator that is used to register a custom template global function.\n        You can specify a name for the global function, otherwise the function\n        name will be used. Example::\n\n            @app.template_global()\n            def double(n):\n                return 2 * n\n\n        .. versionadded:: 0.10\n\n        :param name: the optional name of the global function, otherwise the\n                     function name will be used.\n        \"\"\"\n        def decorator(f):\n            self.add_template_global(f, name=name)\n            return f\n        return decorator\n\n    @setupmethod\n    def add_template_global(self, f, name=None):\n        \"\"\"Register a custom template global function. Works exactly like the\n        :meth:`template_global` decorator.\n\n        .. versionadded:: 0.10\n\n        :param name: the optional name of the global function, otherwise the\n                     function name will be used.\n        \"\"\"\n        self.jinja_env.globals[name or f.__name__] = f\n\n    @setupmethod\n    def before_request(self, f):\n        \"\"\"Registers a function to run before each request.\"\"\"\n        self.before_request_funcs.setdefault(None, []).append(f)\n        return f\n\n    @setupmethod\n    def before_first_request(self, f):\n        \"\"\"Registers a function to be run before the first request to this\n        instance of the application.\n\n        .. versionadded:: 0.8\n        \"\"\"\n        self.before_first_request_funcs.append(f)\n\n    @setupmethod\n    def after_request(self, f):\n        \"\"\"Register a function to be run after each request.  Your function\n        must take one parameter, a :attr:`response_class` object and return\n        a new response object or the same (see :meth:`process_response`).\n\n        As of Flask 0.7 this function might not be executed at the end of the\n        request in case an unhandled exception occurred.\n        \"\"\"\n        self.after_request_funcs.setdefault(None, []).append(f)\n        return f\n\n    @setupmethod\n    def teardown_request(self, f):\n        \"\"\"Register a function to be run at the end of each request,\n        regardless of whether there was an exception or not.  These functions\n        are executed when the request context is popped, even if not an\n        actual request was performed.\n\n        Example::\n\n            ctx = app.test_request_context()\n            ctx.push()\n            ...\n            ctx.pop()\n\n        When ``ctx.pop()`` is executed in the above example, the teardown\n        functions are called just before the request context moves from the\n        stack of active contexts.  This becomes relevant if you are using\n        such constructs in tests.\n\n        Generally teardown functions must take every necessary step to avoid\n        that they will fail.  If they do execute code that might fail they\n        will have to surround the execution of these code by try/except\n        statements and log occurring errors.\n\n        When a teardown function was called because of a exception it will\n        be passed an error object.\n\n        .. admonition:: Debug Note\n\n           In debug mode Flask will not tear down a request on an exception\n           immediately.  Instead if will keep it alive so that the interactive\n           debugger can still access it.  This behavior can be controlled\n           by the ``PRESERVE_CONTEXT_ON_EXCEPTION`` configuration variable.\n        \"\"\"\n        self.teardown_request_funcs.setdefault(None, []).append(f)\n        return f\n\n    @setupmethod\n    def teardown_appcontext(self, f):\n        \"\"\"Registers a function to be called when the application context\n        ends.  These functions are typically also called when the request\n        context is popped.\n\n        Example::\n\n            ctx = app.app_context()\n            ctx.push()\n            ...\n            ctx.pop()\n\n        When ``ctx.pop()`` is executed in the above example, the teardown\n        functions are called just before the app context moves from the\n        stack of active contexts.  This becomes relevant if you are using\n        such constructs in tests.\n\n        Since a request context typically also manages an application\n        context it would also be called when you pop a request context.\n\n        When a teardown function was called because of an exception it will\n        be passed an error object.\n\n        .. versionadded:: 0.9\n        \"\"\"\n        self.teardown_appcontext_funcs.append(f)\n        return f\n\n    @setupmethod\n    def context_processor(self, f):\n        \"\"\"Registers a template context processor function.\"\"\"\n        self.template_context_processors[None].append(f)\n        return f\n\n    @setupmethod\n    def url_value_preprocessor(self, f):\n        \"\"\"Registers a function as URL value preprocessor for all view\n        functions of the application.  It's called before the view functions\n        are called and can modify the url values provided.\n        \"\"\"\n        self.url_value_preprocessors.setdefault(None, []).append(f)\n        return f\n\n    @setupmethod\n    def url_defaults(self, f):\n        \"\"\"Callback function for URL defaults for all view functions of the\n        application.  It's called with the endpoint and values and should\n        update the values passed in place.\n        \"\"\"\n        self.url_default_functions.setdefault(None, []).append(f)\n        return f\n\n    def handle_http_exception(self, e):\n        \"\"\"Handles an HTTP exception.  By default this will invoke the\n        registered error handlers and fall back to returning the\n        exception as response.\n\n        .. versionadded:: 0.3\n        \"\"\"\n        handlers = self.error_handler_spec.get(request.blueprint)\n        # Proxy exceptions don't have error codes.  We want to always return\n        # those unchanged as errors\n        if e.code is None:\n            return e\n        if handlers and e.code in handlers:\n            handler = handlers[e.code]\n        else:\n            handler = self.error_handler_spec[None].get(e.code)\n        if handler is None:\n            return e\n        return handler(e)\n\n    def trap_http_exception(self, e):\n        \"\"\"Checks if an HTTP exception should be trapped or not.  By default\n        this will return `False` for all exceptions except for a bad request\n        key error if ``TRAP_BAD_REQUEST_ERRORS`` is set to `True`.  It\n        also returns `True` if ``TRAP_HTTP_EXCEPTIONS`` is set to `True`.\n\n        This is called for all HTTP exceptions raised by a view function.\n        If it returns `True` for any exception the error handler for this\n        exception is not called and it shows up as regular exception in the\n        traceback.  This is helpful for debugging implicitly raised HTTP\n        exceptions.\n\n        .. versionadded:: 0.8\n        \"\"\"\n        if self.config['TRAP_HTTP_EXCEPTIONS']:\n            return True\n        if self.config['TRAP_BAD_REQUEST_ERRORS']:\n            return isinstance(e, BadRequest)\n        return False\n\n    def handle_user_exception(self, e):\n        \"\"\"This method is called whenever an exception occurs that should be\n        handled.  A special case are\n        :class:`~werkzeug.exception.HTTPException`\\s which are forwarded by\n        this function to the :meth:`handle_http_exception` method.  This\n        function will either return a response value or reraise the\n        exception with the same traceback.\n\n        .. versionadded:: 0.7\n        \"\"\"\n        exc_type, exc_value, tb = sys.exc_info()\n        assert exc_value is e\n\n        # ensure not to trash sys.exc_info() at that point in case someone\n        # wants the traceback preserved in handle_http_exception.  Of course\n        # we cannot prevent users from trashing it themselves in a custom\n        # trap_http_exception method so that's their fault then.\n        if isinstance(e, HTTPException) and not self.trap_http_exception(e):\n            return self.handle_http_exception(e)\n\n        blueprint_handlers = ()\n        handlers = self.error_handler_spec.get(request.blueprint)\n        if handlers is not None:\n            blueprint_handlers = handlers.get(None, ())\n        app_handlers = self.error_handler_spec[None].get(None, ())\n        for typecheck, handler in chain(blueprint_handlers, app_handlers):\n            if isinstance(e, typecheck):\n                return handler(e)\n\n        reraise(exc_type, exc_value, tb)\n\n    def handle_exception(self, e):\n        \"\"\"Default exception handling that kicks in when an exception\n        occurs that is not caught.  In debug mode the exception will\n        be re-raised immediately, otherwise it is logged and the handler\n        for a 500 internal server error is used.  If no such handler\n        exists, a default 500 internal server error message is displayed.\n\n        .. versionadded:: 0.3\n        \"\"\"\n        exc_type, exc_value, tb = sys.exc_info()\n\n        got_request_exception.send(self, exception=e)\n        handler = self.error_handler_spec[None].get(500)\n\n        if self.propagate_exceptions:\n            # if we want to repropagate the exception, we can attempt to\n            # raise it with the whole traceback in case we can do that\n            # (the function was actually called from the except part)\n            # otherwise, we just raise the error again\n            if exc_value is e:\n                reraise(exc_type, exc_value, tb)\n            else:\n                raise e\n\n        self.log_exception((exc_type, exc_value, tb))\n        if handler is None:\n            return InternalServerError()\n        return handler(e)\n\n    def log_exception(self, exc_info):\n        \"\"\"Logs an exception.  This is called by :meth:`handle_exception`\n        if debugging is disabled and right before the handler is called.\n        The default implementation logs the exception as error on the\n        :attr:`logger`.\n\n        .. versionadded:: 0.8\n        \"\"\"\n        self.logger.error('Exception on %s [%s]' % (\n            request.path,\n            request.method\n        ), exc_info=exc_info)\n\n    def raise_routing_exception(self, request):\n        \"\"\"Exceptions that are recording during routing are reraised with\n        this method.  During debug we are not reraising redirect requests\n        for non ``GET``, ``HEAD``, or ``OPTIONS`` requests and we're raising\n        a different error instead to help debug situations.\n\n        :internal:\n        \"\"\"\n        if not self.debug \\\n           or not isinstance(request.routing_exception, RequestRedirect) \\\n           or request.method in ('GET', 'HEAD', 'OPTIONS'):\n            raise request.routing_exception\n\n        from .debughelpers import FormDataRoutingRedirect\n        raise FormDataRoutingRedirect(request)\n\n    def dispatch_request(self):\n        \"\"\"Does the request dispatching.  Matches the URL and returns the\n        return value of the view or error handler.  This does not have to\n        be a response object.  In order to convert the return value to a\n        proper response object, call :func:`make_response`.\n\n        .. versionchanged:: 0.7\n           This no longer does the exception handling, this code was\n           moved to the new :meth:`full_dispatch_request`.\n        \"\"\"\n        req = _request_ctx_stack.top.request\n        if req.routing_exception is not None:\n            self.raise_routing_exception(req)\n        rule = req.url_rule\n        # if we provide automatic options for this URL and the\n        # request came with the OPTIONS method, reply automatically\n        if getattr(rule, 'provide_automatic_options', False) \\\n           and req.method == 'OPTIONS':\n            return self.make_default_options_response()\n        # otherwise dispatch to the handler for that endpoint\n        return self.view_functions[rule.endpoint](**req.view_args)\n\n    def full_dispatch_request(self):\n        \"\"\"Dispatches the request and on top of that performs request\n        pre and postprocessing as well as HTTP exception catching and\n        error handling.\n\n        .. versionadded:: 0.7\n        \"\"\"\n        self.try_trigger_before_first_request_functions()\n        try:\n            request_started.send(self)\n            rv = self.preprocess_request()\n            if rv is None:\n                rv = self.dispatch_request()\n        except Exception as e:\n            rv = self.handle_user_exception(e)\n        response = self.make_response(rv)\n        response = self.process_response(response)\n        request_finished.send(self, response=response)\n        return response\n\n    def try_trigger_before_first_request_functions(self):\n        \"\"\"Called before each request and will ensure that it triggers\n        the :attr:`before_first_request_funcs` and only exactly once per\n        application instance (which means process usually).\n\n        :internal:\n        \"\"\"\n        if self._got_first_request:\n            return\n        with self._before_request_lock:\n            if self._got_first_request:\n                return\n            self._got_first_request = True\n            for func in self.before_first_request_funcs:\n                func()\n\n    def make_default_options_response(self):\n        \"\"\"This method is called to create the default `OPTIONS` response.\n        This can be changed through subclassing to change the default\n        behavior of `OPTIONS` responses.\n\n        .. versionadded:: 0.7\n        \"\"\"\n        adapter = _request_ctx_stack.top.url_adapter\n        if hasattr(adapter, 'allowed_methods'):\n            methods = adapter.allowed_methods()\n        else:\n            # fallback for Werkzeug < 0.7\n            methods = []\n            try:\n                adapter.match(method='--')\n            except MethodNotAllowed as e:\n                methods = e.valid_methods\n            except HTTPException as e:\n                pass\n        rv = self.response_class()\n        rv.allow.update(methods)\n        return rv\n\n    def should_ignore_error(self, error):\n        \"\"\"This is called to figure out if an error should be ignored\n        or not as far as the teardown system is concerned.  If this\n        function returns `True` then the teardown handlers will not be\n        passed the error.\n\n        .. versionadded:: 0.10\n        \"\"\"\n        return False\n\n    def make_response(self, rv):\n        \"\"\"Converts the return value from a view function to a real\n        response object that is an instance of :attr:`response_class`.\n\n        The following types are allowed for `rv`:\n\n        .. tabularcolumns:: |p{3.5cm}|p{9.5cm}|\n\n        ======================= ===========================================\n        :attr:`response_class`  the object is returned unchanged\n        :class:`str`            a response object is created with the\n                                string as body\n        :class:`unicode`        a response object is created with the\n                                string encoded to utf-8 as body\n        a WSGI function         the function is called as WSGI application\n                                and buffered as response object\n        :class:`tuple`          A tuple in the form ``(response, status,\n                                headers)`` where `response` is any of the\n                                types defined here, `status` is a string\n                                or an integer and `headers` is a list of\n                                a dictionary with header values.\n        ======================= ===========================================\n\n        :param rv: the return value from the view function\n\n        .. versionchanged:: 0.9\n           Previously a tuple was interpreted as the arguments for the\n           response object.\n        \"\"\"\n        status = headers = None\n        if isinstance(rv, tuple):\n            rv, status, headers = rv + (None,) * (3 - len(rv))\n\n        if rv is None:\n            raise ValueError('View function did not return a response')\n\n        if not isinstance(rv, self.response_class):\n            # When we create a response object directly, we let the constructor\n            # set the headers and status.  We do this because there can be\n            # some extra logic involved when creating these objects with\n            # specific values (like default content type selection).\n            if isinstance(rv, (text_type, bytes, bytearray)):\n                rv = self.response_class(rv, headers=headers, status=status)\n                headers = status = None\n            else:\n                rv = self.response_class.force_type(rv, request.environ)\n\n        if status is not None:\n            if isinstance(status, string_types):\n                rv.status = status\n            else:\n                rv.status_code = status\n        if headers:\n            rv.headers.extend(headers)\n\n        return rv\n\n    def create_url_adapter(self, request):\n        \"\"\"Creates a URL adapter for the given request.  The URL adapter\n        is created at a point where the request context is not yet set up\n        so the request is passed explicitly.\n\n        .. versionadded:: 0.6\n\n        .. versionchanged:: 0.9\n           This can now also be called without a request object when the\n           URL adapter is created for the application context.\n        \"\"\"\n        if request is not None:\n            return self.url_map.bind_to_environ(request.environ,\n                server_name=self.config['SERVER_NAME'])\n        # We need at the very least the server name to be set for this\n        # to work.\n        if self.config['SERVER_NAME'] is not None:\n            return self.url_map.bind(\n                self.config['SERVER_NAME'],\n                script_name=self.config['APPLICATION_ROOT'] or '/',\n                url_scheme=self.config['PREFERRED_URL_SCHEME'])\n\n    def inject_url_defaults(self, endpoint, values):\n        \"\"\"Injects the URL defaults for the given endpoint directly into\n        the values dictionary passed.  This is used internally and\n        automatically called on URL building.\n\n        .. versionadded:: 0.7\n        \"\"\"\n        funcs = self.url_default_functions.get(None, ())\n        if '.' in endpoint:\n            bp = endpoint.rsplit('.', 1)[0]\n            funcs = chain(funcs, self.url_default_functions.get(bp, ()))\n        for func in funcs:\n            func(endpoint, values)\n\n    def handle_url_build_error(self, error, endpoint, values):\n        \"\"\"Handle :class:`~werkzeug.routing.BuildError` on :meth:`url_for`.\n        \"\"\"\n        exc_type, exc_value, tb = sys.exc_info()\n        for handler in self.url_build_error_handlers:\n            try:\n                rv = handler(error, endpoint, values)\n                if rv is not None:\n                    return rv\n            except BuildError as error:\n                pass\n\n        # At this point we want to reraise the exception.  If the error is\n        # still the same one we can reraise it with the original traceback,\n        # otherwise we raise it from here.\n        if error is exc_value:\n            reraise(exc_type, exc_value, tb)\n        raise error\n\n    def preprocess_request(self):\n        \"\"\"Called before the actual request dispatching and will\n        call every as :meth:`before_request` decorated function.\n        If any of these function returns a value it's handled as\n        if it was the return value from the view and further\n        request handling is stopped.\n\n        This also triggers the :meth:`url_value_processor` functions before\n        the actual :meth:`before_request` functions are called.\n        \"\"\"\n        bp = _request_ctx_stack.top.request.blueprint\n\n        funcs = self.url_value_preprocessors.get(None, ())\n        if bp is not None and bp in self.url_value_preprocessors:\n            funcs = chain(funcs, self.url_value_preprocessors[bp])\n        for func in funcs:\n            func(request.endpoint, request.view_args)\n\n        funcs = self.before_request_funcs.get(None, ())\n        if bp is not None and bp in self.before_request_funcs:\n            funcs = chain(funcs, self.before_request_funcs[bp])\n        for func in funcs:\n            rv = func()\n            if rv is not None:\n                return rv\n\n    def process_response(self, response):\n        \"\"\"Can be overridden in order to modify the response object\n        before it's sent to the WSGI server.  By default this will\n        call all the :meth:`after_request` decorated functions.\n\n        .. versionchanged:: 0.5\n           As of Flask 0.5 the functions registered for after request\n           execution are called in reverse order of registration.\n\n        :param response: a :attr:`response_class` object.\n        :return: a new response object or the same, has to be an\n                 instance of :attr:`response_class`.\n        \"\"\"\n        ctx = _request_ctx_stack.top\n        bp = ctx.request.blueprint\n        funcs = ctx._after_request_functions\n        if bp is not None and bp in self.after_request_funcs:\n            funcs = chain(funcs, reversed(self.after_request_funcs[bp]))\n        if None in self.after_request_funcs:\n            funcs = chain(funcs, reversed(self.after_request_funcs[None]))\n        for handler in funcs:\n            response = handler(response)\n        if not self.session_interface.is_null_session(ctx.session):\n            self.save_session(ctx.session, response)\n        return response\n\n    def do_teardown_request(self, exc=None):\n        \"\"\"Called after the actual request dispatching and will\n        call every as :meth:`teardown_request` decorated function.  This is\n        not actually called by the :class:`Flask` object itself but is always\n        triggered when the request context is popped.  That way we have a\n        tighter control over certain resources under testing environments.\n\n        .. versionchanged:: 0.9\n           Added the `exc` argument.  Previously this was always using the\n           current exception information.\n        \"\"\"\n        if exc is None:\n            exc = sys.exc_info()[1]\n        funcs = reversed(self.teardown_request_funcs.get(None, ()))\n        bp = _request_ctx_stack.top.request.blueprint\n        if bp is not None and bp in self.teardown_request_funcs:\n            funcs = chain(funcs, reversed(self.teardown_request_funcs[bp]))\n        for func in funcs:\n            rv = func(exc)\n        request_tearing_down.send(self, exc=exc)\n\n    def do_teardown_appcontext(self, exc=None):\n        \"\"\"Called when an application context is popped.  This works pretty\n        much the same as :meth:`do_teardown_request` but for the application\n        context.\n\n        .. versionadded:: 0.9\n        \"\"\"\n        if exc is None:\n            exc = sys.exc_info()[1]\n        for func in reversed(self.teardown_appcontext_funcs):\n            func(exc)\n        appcontext_tearing_down.send(self, exc=exc)\n\n    def app_context(self):\n        \"\"\"Binds the application only.  For as long as the application is bound\n        to the current context the :data:`flask.current_app` points to that\n        application.  An application context is automatically created when a\n        request context is pushed if necessary.\n\n        Example usage::\n\n            with app.app_context():\n                ...\n\n        .. versionadded:: 0.9\n        \"\"\"\n        return AppContext(self)\n\n    def request_context(self, environ):\n        \"\"\"Creates a :class:`~flask.ctx.RequestContext` from the given\n        environment and binds it to the current context.  This must be used in\n        combination with the `with` statement because the request is only bound\n        to the current context for the duration of the `with` block.\n\n        Example usage::\n\n            with app.request_context(environ):\n                do_something_with(request)\n\n        The object returned can also be used without the `with` statement\n        which is useful for working in the shell.  The example above is\n        doing exactly the same as this code::\n\n            ctx = app.request_context(environ)\n            ctx.push()\n            try:\n                do_something_with(request)\n            finally:\n                ctx.pop()\n\n        .. versionchanged:: 0.3\n           Added support for non-with statement usage and `with` statement\n           is now passed the ctx object.\n\n        :param environ: a WSGI environment\n        \"\"\"\n        return RequestContext(self, environ)\n\n    def test_request_context(self, *args, **kwargs):\n        \"\"\"Creates a WSGI environment from the given values (see\n        :func:`werkzeug.test.EnvironBuilder` for more information, this\n        function accepts the same arguments).\n        \"\"\"\n        from flask.testing import make_test_environ_builder\n        builder = make_test_environ_builder(self, *args, **kwargs)\n        try:\n            return self.request_context(builder.get_environ())\n        finally:\n            builder.close()\n\n    def wsgi_app(self, environ, start_response):\n        \"\"\"The actual WSGI application.  This is not implemented in\n        `__call__` so that middlewares can be applied without losing a\n        reference to the class.  So instead of doing this::\n\n            app = MyMiddleware(app)\n\n        It's a better idea to do this instead::\n\n            app.wsgi_app = MyMiddleware(app.wsgi_app)\n\n        Then you still have the original application object around and\n        can continue to call methods on it.\n\n        .. versionchanged:: 0.7\n           The behavior of the before and after request callbacks was changed\n           under error conditions and a new callback was added that will\n           always execute at the end of the request, independent on if an\n           error occurred or not.  See :ref:`callbacks-and-errors`.\n\n        :param environ: a WSGI environment\n        :param start_response: a callable accepting a status code,\n                               a list of headers and an optional\n                               exception context to start the response\n        \"\"\"\n        ctx = self.request_context(environ)\n        ctx.push()\n        error = None\n        try:\n            try:\n                response = self.full_dispatch_request()\n            except Exception as e:\n                error = e\n                response = self.make_response(self.handle_exception(e))\n            return response(environ, start_response)\n        finally:\n            if self.should_ignore_error(error):\n                error = None\n            ctx.auto_pop(error)\n\n    @property\n    def modules(self):\n        from warnings import warn\n        warn(DeprecationWarning('Flask.modules is deprecated, use '\n                                'Flask.blueprints instead'), stacklevel=2)\n        return self.blueprints\n\n    def __call__(self, environ, start_response):\n        \"\"\"Shortcut for :attr:`wsgi_app`.\"\"\"\n        return self.wsgi_app(environ, start_response)\n\n    def __repr__(self):\n        return '<%s %r>' % (\n            self.__class__.__name__,\n            self.name,\n        )\n"
  },
  {
    "path": "lib/flask/blueprints.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    flask.blueprints\n    ~~~~~~~~~~~~~~~~\n\n    Blueprints are the recommended way to implement larger or more\n    pluggable applications in Flask 0.7 and later.\n\n    :copyright: (c) 2011 by Armin Ronacher.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nfrom functools import update_wrapper\n\nfrom .helpers import _PackageBoundObject, _endpoint_from_view_func\n\n\nclass BlueprintSetupState(object):\n    \"\"\"Temporary holder object for registering a blueprint with the\n    application.  An instance of this class is created by the\n    :meth:`~flask.Blueprint.make_setup_state` method and later passed\n    to all register callback functions.\n    \"\"\"\n\n    def __init__(self, blueprint, app, options, first_registration):\n        #: a reference to the current application\n        self.app = app\n\n        #: a reference to the blueprint that created this setup state.\n        self.blueprint = blueprint\n\n        #: a dictionary with all options that were passed to the\n        #: :meth:`~flask.Flask.register_blueprint` method.\n        self.options = options\n\n        #: as blueprints can be registered multiple times with the\n        #: application and not everything wants to be registered\n        #: multiple times on it, this attribute can be used to figure\n        #: out if the blueprint was registered in the past already.\n        self.first_registration = first_registration\n\n        subdomain = self.options.get('subdomain')\n        if subdomain is None:\n            subdomain = self.blueprint.subdomain\n\n        #: The subdomain that the blueprint should be active for, `None`\n        #: otherwise.\n        self.subdomain = subdomain\n\n        url_prefix = self.options.get('url_prefix')\n        if url_prefix is None:\n            url_prefix = self.blueprint.url_prefix\n\n        #: The prefix that should be used for all URLs defined on the\n        #: blueprint.\n        self.url_prefix = url_prefix\n\n        #: A dictionary with URL defaults that is added to each and every\n        #: URL that was defined with the blueprint.\n        self.url_defaults = dict(self.blueprint.url_values_defaults)\n        self.url_defaults.update(self.options.get('url_defaults', ()))\n\n    def add_url_rule(self, rule, endpoint=None, view_func=None, **options):\n        \"\"\"A helper method to register a rule (and optionally a view function)\n        to the application.  The endpoint is automatically prefixed with the\n        blueprint's name.\n        \"\"\"\n        if self.url_prefix:\n            rule = self.url_prefix + rule\n        options.setdefault('subdomain', self.subdomain)\n        if endpoint is None:\n            endpoint = _endpoint_from_view_func(view_func)\n        defaults = self.url_defaults\n        if 'defaults' in options:\n            defaults = dict(defaults, **options.pop('defaults'))\n        self.app.add_url_rule(rule, '%s.%s' % (self.blueprint.name, endpoint),\n                              view_func, defaults=defaults, **options)\n\n\nclass Blueprint(_PackageBoundObject):\n    \"\"\"Represents a blueprint.  A blueprint is an object that records\n    functions that will be called with the\n    :class:`~flask.blueprint.BlueprintSetupState` later to register functions\n    or other things on the main application.  See :ref:`blueprints` for more\n    information.\n\n    .. versionadded:: 0.7\n    \"\"\"\n\n    warn_on_modifications = False\n    _got_registered_once = False\n\n    def __init__(self, name, import_name, static_folder=None,\n                 static_url_path=None, template_folder=None,\n                 url_prefix=None, subdomain=None, url_defaults=None):\n        _PackageBoundObject.__init__(self, import_name, template_folder)\n        self.name = name\n        self.url_prefix = url_prefix\n        self.subdomain = subdomain\n        self.static_folder = static_folder\n        self.static_url_path = static_url_path\n        self.deferred_functions = []\n        self.view_functions = {}\n        if url_defaults is None:\n            url_defaults = {}\n        self.url_values_defaults = url_defaults\n\n    def record(self, func):\n        \"\"\"Registers a function that is called when the blueprint is\n        registered on the application.  This function is called with the\n        state as argument as returned by the :meth:`make_setup_state`\n        method.\n        \"\"\"\n        if self._got_registered_once and self.warn_on_modifications:\n            from warnings import warn\n            warn(Warning('The blueprint was already registered once '\n                         'but is getting modified now.  These changes '\n                         'will not show up.'))\n        self.deferred_functions.append(func)\n\n    def record_once(self, func):\n        \"\"\"Works like :meth:`record` but wraps the function in another\n        function that will ensure the function is only called once.  If the\n        blueprint is registered a second time on the application, the\n        function passed is not called.\n        \"\"\"\n        def wrapper(state):\n            if state.first_registration:\n                func(state)\n        return self.record(update_wrapper(wrapper, func))\n\n    def make_setup_state(self, app, options, first_registration=False):\n        \"\"\"Creates an instance of :meth:`~flask.blueprints.BlueprintSetupState`\n        object that is later passed to the register callback functions.\n        Subclasses can override this to return a subclass of the setup state.\n        \"\"\"\n        return BlueprintSetupState(self, app, options, first_registration)\n\n    def register(self, app, options, first_registration=False):\n        \"\"\"Called by :meth:`Flask.register_blueprint` to register a blueprint\n        on the application.  This can be overridden to customize the register\n        behavior.  Keyword arguments from\n        :func:`~flask.Flask.register_blueprint` are directly forwarded to this\n        method in the `options` dictionary.\n        \"\"\"\n        self._got_registered_once = True\n        state = self.make_setup_state(app, options, first_registration)\n        if self.has_static_folder:\n            state.add_url_rule(self.static_url_path + '/<path:filename>',\n                               view_func=self.send_static_file,\n                               endpoint='static')\n\n        for deferred in self.deferred_functions:\n            deferred(state)\n\n    def route(self, rule, **options):\n        \"\"\"Like :meth:`Flask.route` but for a blueprint.  The endpoint for the\n        :func:`url_for` function is prefixed with the name of the blueprint.\n        \"\"\"\n        def decorator(f):\n            endpoint = options.pop(\"endpoint\", f.__name__)\n            self.add_url_rule(rule, endpoint, f, **options)\n            return f\n        return decorator\n\n    def add_url_rule(self, rule, endpoint=None, view_func=None, **options):\n        \"\"\"Like :meth:`Flask.add_url_rule` but for a blueprint.  The endpoint for\n        the :func:`url_for` function is prefixed with the name of the blueprint.\n        \"\"\"\n        if endpoint:\n            assert '.' not in endpoint, \"Blueprint endpoint's should not contain dot's\"\n        self.record(lambda s:\n            s.add_url_rule(rule, endpoint, view_func, **options))\n\n    def endpoint(self, endpoint):\n        \"\"\"Like :meth:`Flask.endpoint` but for a blueprint.  This does not\n        prefix the endpoint with the blueprint name, this has to be done\n        explicitly by the user of this method.  If the endpoint is prefixed\n        with a `.` it will be registered to the current blueprint, otherwise\n        it's an application independent endpoint.\n        \"\"\"\n        def decorator(f):\n            def register_endpoint(state):\n                state.app.view_functions[endpoint] = f\n            self.record_once(register_endpoint)\n            return f\n        return decorator\n\n    def app_template_filter(self, name=None):\n        \"\"\"Register a custom template filter, available application wide.  Like\n        :meth:`Flask.template_filter` but for a blueprint.\n\n        :param name: the optional name of the filter, otherwise the\n                     function name will be used.\n        \"\"\"\n        def decorator(f):\n            self.add_app_template_filter(f, name=name)\n            return f\n        return decorator\n\n    def add_app_template_filter(self, f, name=None):\n        \"\"\"Register a custom template filter, available application wide.  Like\n        :meth:`Flask.add_template_filter` but for a blueprint.  Works exactly\n        like the :meth:`app_template_filter` decorator.\n\n        :param name: the optional name of the filter, otherwise the\n                     function name will be used.\n        \"\"\"\n        def register_template(state):\n            state.app.jinja_env.filters[name or f.__name__] = f\n        self.record_once(register_template)\n\n    def app_template_test(self, name=None):\n        \"\"\"Register a custom template test, available application wide.  Like\n        :meth:`Flask.template_test` but for a blueprint.\n\n        .. versionadded:: 0.10\n\n        :param name: the optional name of the test, otherwise the\n                     function name will be used.\n        \"\"\"\n        def decorator(f):\n            self.add_app_template_test(f, name=name)\n            return f\n        return decorator\n\n    def add_app_template_test(self, f, name=None):\n        \"\"\"Register a custom template test, available application wide.  Like\n        :meth:`Flask.add_template_test` but for a blueprint.  Works exactly\n        like the :meth:`app_template_test` decorator.\n\n        .. versionadded:: 0.10\n\n        :param name: the optional name of the test, otherwise the\n                     function name will be used.\n        \"\"\"\n        def register_template(state):\n            state.app.jinja_env.tests[name or f.__name__] = f\n        self.record_once(register_template)\n\n    def app_template_global(self, name=None):\n        \"\"\"Register a custom template global, available application wide.  Like\n        :meth:`Flask.template_global` but for a blueprint.\n\n        .. versionadded:: 0.10\n\n        :param name: the optional name of the global, otherwise the\n                     function name will be used.\n        \"\"\"\n        def decorator(f):\n            self.add_app_template_global(f, name=name)\n            return f\n        return decorator\n\n    def add_app_template_global(self, f, name=None):\n        \"\"\"Register a custom template global, available application wide.  Like\n        :meth:`Flask.add_template_global` but for a blueprint.  Works exactly\n        like the :meth:`app_template_global` decorator.\n\n        .. versionadded:: 0.10\n\n        :param name: the optional name of the global, otherwise the\n                     function name will be used.\n        \"\"\"\n        def register_template(state):\n            state.app.jinja_env.globals[name or f.__name__] = f\n        self.record_once(register_template)\n\n    def before_request(self, f):\n        \"\"\"Like :meth:`Flask.before_request` but for a blueprint.  This function\n        is only executed before each request that is handled by a function of\n        that blueprint.\n        \"\"\"\n        self.record_once(lambda s: s.app.before_request_funcs\n            .setdefault(self.name, []).append(f))\n        return f\n\n    def before_app_request(self, f):\n        \"\"\"Like :meth:`Flask.before_request`.  Such a function is executed\n        before each request, even if outside of a blueprint.\n        \"\"\"\n        self.record_once(lambda s: s.app.before_request_funcs\n            .setdefault(None, []).append(f))\n        return f\n\n    def before_app_first_request(self, f):\n        \"\"\"Like :meth:`Flask.before_first_request`.  Such a function is\n        executed before the first request to the application.\n        \"\"\"\n        self.record_once(lambda s: s.app.before_first_request_funcs.append(f))\n        return f\n\n    def after_request(self, f):\n        \"\"\"Like :meth:`Flask.after_request` but for a blueprint.  This function\n        is only executed after each request that is handled by a function of\n        that blueprint.\n        \"\"\"\n        self.record_once(lambda s: s.app.after_request_funcs\n            .setdefault(self.name, []).append(f))\n        return f\n\n    def after_app_request(self, f):\n        \"\"\"Like :meth:`Flask.after_request` but for a blueprint.  Such a function\n        is executed after each request, even if outside of the blueprint.\n        \"\"\"\n        self.record_once(lambda s: s.app.after_request_funcs\n            .setdefault(None, []).append(f))\n        return f\n\n    def teardown_request(self, f):\n        \"\"\"Like :meth:`Flask.teardown_request` but for a blueprint.  This\n        function is only executed when tearing down requests handled by a\n        function of that blueprint.  Teardown request functions are executed\n        when the request context is popped, even when no actual request was\n        performed.\n        \"\"\"\n        self.record_once(lambda s: s.app.teardown_request_funcs\n            .setdefault(self.name, []).append(f))\n        return f\n\n    def teardown_app_request(self, f):\n        \"\"\"Like :meth:`Flask.teardown_request` but for a blueprint.  Such a\n        function is executed when tearing down each request, even if outside of\n        the blueprint.\n        \"\"\"\n        self.record_once(lambda s: s.app.teardown_request_funcs\n            .setdefault(None, []).append(f))\n        return f\n\n    def context_processor(self, f):\n        \"\"\"Like :meth:`Flask.context_processor` but for a blueprint.  This\n        function is only executed for requests handled by a blueprint.\n        \"\"\"\n        self.record_once(lambda s: s.app.template_context_processors\n            .setdefault(self.name, []).append(f))\n        return f\n\n    def app_context_processor(self, f):\n        \"\"\"Like :meth:`Flask.context_processor` but for a blueprint.  Such a\n        function is executed each request, even if outside of the blueprint.\n        \"\"\"\n        self.record_once(lambda s: s.app.template_context_processors\n            .setdefault(None, []).append(f))\n        return f\n\n    def app_errorhandler(self, code):\n        \"\"\"Like :meth:`Flask.errorhandler` but for a blueprint.  This\n        handler is used for all requests, even if outside of the blueprint.\n        \"\"\"\n        def decorator(f):\n            self.record_once(lambda s: s.app.errorhandler(code)(f))\n            return f\n        return decorator\n\n    def url_value_preprocessor(self, f):\n        \"\"\"Registers a function as URL value preprocessor for this\n        blueprint.  It's called before the view functions are called and\n        can modify the url values provided.\n        \"\"\"\n        self.record_once(lambda s: s.app.url_value_preprocessors\n            .setdefault(self.name, []).append(f))\n        return f\n\n    def url_defaults(self, f):\n        \"\"\"Callback function for URL defaults for this blueprint.  It's called\n        with the endpoint and values and should update the values passed\n        in place.\n        \"\"\"\n        self.record_once(lambda s: s.app.url_default_functions\n            .setdefault(self.name, []).append(f))\n        return f\n\n    def app_url_value_preprocessor(self, f):\n        \"\"\"Same as :meth:`url_value_preprocessor` but application wide.\n        \"\"\"\n        self.record_once(lambda s: s.app.url_value_preprocessors\n            .setdefault(None, []).append(f))\n        return f\n\n    def app_url_defaults(self, f):\n        \"\"\"Same as :meth:`url_defaults` but application wide.\n        \"\"\"\n        self.record_once(lambda s: s.app.url_default_functions\n            .setdefault(None, []).append(f))\n        return f\n\n    def errorhandler(self, code_or_exception):\n        \"\"\"Registers an error handler that becomes active for this blueprint\n        only.  Please be aware that routing does not happen local to a\n        blueprint so an error handler for 404 usually is not handled by\n        a blueprint unless it is caused inside a view function.  Another\n        special case is the 500 internal server error which is always looked\n        up from the application.\n\n        Otherwise works as the :meth:`~flask.Flask.errorhandler` decorator\n        of the :class:`~flask.Flask` object.\n        \"\"\"\n        def decorator(f):\n            self.record_once(lambda s: s.app._register_error_handler(\n                self.name, code_or_exception, f))\n            return f\n        return decorator\n"
  },
  {
    "path": "lib/flask/config.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    flask.config\n    ~~~~~~~~~~~~\n\n    Implements the configuration related objects.\n\n    :copyright: (c) 2011 by Armin Ronacher.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\n\nimport imp\nimport os\nimport errno\n\nfrom werkzeug.utils import import_string\nfrom ._compat import string_types\n\n\nclass ConfigAttribute(object):\n    \"\"\"Makes an attribute forward to the config\"\"\"\n\n    def __init__(self, name, get_converter=None):\n        self.__name__ = name\n        self.get_converter = get_converter\n\n    def __get__(self, obj, type=None):\n        if obj is None:\n            return self\n        rv = obj.config[self.__name__]\n        if self.get_converter is not None:\n            rv = self.get_converter(rv)\n        return rv\n\n    def __set__(self, obj, value):\n        obj.config[self.__name__] = value\n\n\nclass Config(dict):\n    \"\"\"Works exactly like a dict but provides ways to fill it from files\n    or special dictionaries.  There are two common patterns to populate the\n    config.\n\n    Either you can fill the config from a config file::\n\n        app.config.from_pyfile('yourconfig.cfg')\n\n    Or alternatively you can define the configuration options in the\n    module that calls :meth:`from_object` or provide an import path to\n    a module that should be loaded.  It is also possible to tell it to\n    use the same module and with that provide the configuration values\n    just before the call::\n\n        DEBUG = True\n        SECRET_KEY = 'development key'\n        app.config.from_object(__name__)\n\n    In both cases (loading from any Python file or loading from modules),\n    only uppercase keys are added to the config.  This makes it possible to use\n    lowercase values in the config file for temporary values that are not added\n    to the config or to define the config keys in the same file that implements\n    the application.\n\n    Probably the most interesting way to load configurations is from an\n    environment variable pointing to a file::\n\n        app.config.from_envvar('YOURAPPLICATION_SETTINGS')\n\n    In this case before launching the application you have to set this\n    environment variable to the file you want to use.  On Linux and OS X\n    use the export statement::\n\n        export YOURAPPLICATION_SETTINGS='/path/to/config/file'\n\n    On windows use `set` instead.\n\n    :param root_path: path to which files are read relative from.  When the\n                      config object is created by the application, this is\n                      the application's :attr:`~flask.Flask.root_path`.\n    :param defaults: an optional dictionary of default values\n    \"\"\"\n\n    def __init__(self, root_path, defaults=None):\n        dict.__init__(self, defaults or {})\n        self.root_path = root_path\n\n    def from_envvar(self, variable_name, silent=False):\n        \"\"\"Loads a configuration from an environment variable pointing to\n        a configuration file.  This is basically just a shortcut with nicer\n        error messages for this line of code::\n\n            app.config.from_pyfile(os.environ['YOURAPPLICATION_SETTINGS'])\n\n        :param variable_name: name of the environment variable\n        :param silent: set to `True` if you want silent failure for missing\n                       files.\n        :return: bool. `True` if able to load config, `False` otherwise.\n        \"\"\"\n        rv = os.environ.get(variable_name)\n        if not rv:\n            if silent:\n                return False\n            raise RuntimeError('The environment variable %r is not set '\n                               'and as such configuration could not be '\n                               'loaded.  Set this variable and make it '\n                               'point to a configuration file' %\n                               variable_name)\n        return self.from_pyfile(rv, silent=silent)\n\n    def from_pyfile(self, filename, silent=False):\n        \"\"\"Updates the values in the config from a Python file.  This function\n        behaves as if the file was imported as module with the\n        :meth:`from_object` function.\n\n        :param filename: the filename of the config.  This can either be an\n                         absolute filename or a filename relative to the\n                         root path.\n        :param silent: set to `True` if you want silent failure for missing\n                       files.\n\n        .. versionadded:: 0.7\n           `silent` parameter.\n        \"\"\"\n        filename = os.path.join(self.root_path, filename)\n        d = imp.new_module('config')\n        d.__file__ = filename\n        try:\n            with open(filename) as config_file:\n                exec(compile(config_file.read(), filename, 'exec'), d.__dict__)\n        except IOError as e:\n            if silent and e.errno in (errno.ENOENT, errno.EISDIR):\n                return False\n            e.strerror = 'Unable to load configuration file (%s)' % e.strerror\n            raise\n        self.from_object(d)\n        return True\n\n    def from_object(self, obj):\n        \"\"\"Updates the values from the given object.  An object can be of one\n        of the following two types:\n\n        -   a string: in this case the object with that name will be imported\n        -   an actual object reference: that object is used directly\n\n        Objects are usually either modules or classes.\n\n        Just the uppercase variables in that object are stored in the config.\n        Example usage::\n\n            app.config.from_object('yourapplication.default_config')\n            from yourapplication import default_config\n            app.config.from_object(default_config)\n\n        You should not use this function to load the actual configuration but\n        rather configuration defaults.  The actual config should be loaded\n        with :meth:`from_pyfile` and ideally from a location not within the\n        package because the package might be installed system wide.\n\n        :param obj: an import name or object\n        \"\"\"\n        if isinstance(obj, string_types):\n            obj = import_string(obj)\n        for key in dir(obj):\n            if key.isupper():\n                self[key] = getattr(obj, key)\n\n    def __repr__(self):\n        return '<%s %s>' % (self.__class__.__name__, dict.__repr__(self))\n"
  },
  {
    "path": "lib/flask/ctx.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    flask.ctx\n    ~~~~~~~~~\n\n    Implements the objects required to keep the context.\n\n    :copyright: (c) 2011 by Armin Ronacher.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\n\nfrom __future__ import with_statement\n\nimport sys\nfrom functools import update_wrapper\n\nfrom werkzeug.exceptions import HTTPException\n\nfrom .globals import _request_ctx_stack, _app_ctx_stack\nfrom .module import blueprint_is_module\nfrom .signals import appcontext_pushed, appcontext_popped\n\n\nclass _AppCtxGlobals(object):\n    \"\"\"A plain object.\"\"\"\n\n    def get(self, name, default=None):\n        return self.__dict__.get(name, default)\n\n    def __contains__(self, item):\n        return item in self.__dict__\n\n    def __iter__(self):\n        return iter(self.__dict__)\n\n    def __repr__(self):\n        top = _app_ctx_stack.top\n        if top is not None:\n            return '<flask.g of %r>' % top.app.name\n        return object.__repr__(self)\n\n\ndef after_this_request(f):\n    \"\"\"Executes a function after this request.  This is useful to modify\n    response objects.  The function is passed the response object and has\n    to return the same or a new one.\n\n    Example::\n\n        @app.route('/')\n        def index():\n            @after_this_request\n            def add_header(response):\n                response.headers['X-Foo'] = 'Parachute'\n                return response\n            return 'Hello World!'\n\n    This is more useful if a function other than the view function wants to\n    modify a response.  For instance think of a decorator that wants to add\n    some headers without converting the return value into a response object.\n\n    .. versionadded:: 0.9\n    \"\"\"\n    _request_ctx_stack.top._after_request_functions.append(f)\n    return f\n\n\ndef copy_current_request_context(f):\n    \"\"\"A helper function that decorates a function to retain the current\n    request context.  This is useful when working with greenlets.  The moment\n    the function is decorated a copy of the request context is created and\n    then pushed when the function is called.\n\n    Example::\n\n        import gevent\n        from flask import copy_current_request_context\n\n        @app.route('/')\n        def index():\n            @copy_current_request_context\n            def do_some_work():\n                # do some work here, it can access flask.request like you\n                # would otherwise in the view function.\n                ...\n            gevent.spawn(do_some_work)\n            return 'Regular response'\n\n    .. versionadded:: 0.10\n    \"\"\"\n    top = _request_ctx_stack.top\n    if top is None:\n        raise RuntimeError('This decorator can only be used at local scopes '\n            'when a request context is on the stack.  For instance within '\n            'view functions.')\n    reqctx = top.copy()\n    def wrapper(*args, **kwargs):\n        with reqctx:\n            return f(*args, **kwargs)\n    return update_wrapper(wrapper, f)\n\n\ndef has_request_context():\n    \"\"\"If you have code that wants to test if a request context is there or\n    not this function can be used.  For instance, you may want to take advantage\n    of request information if the request object is available, but fail\n    silently if it is unavailable.\n\n    ::\n\n        class User(db.Model):\n\n            def __init__(self, username, remote_addr=None):\n                self.username = username\n                if remote_addr is None and has_request_context():\n                    remote_addr = request.remote_addr\n                self.remote_addr = remote_addr\n\n    Alternatively you can also just test any of the context bound objects\n    (such as :class:`request` or :class:`g` for truthness)::\n\n        class User(db.Model):\n\n            def __init__(self, username, remote_addr=None):\n                self.username = username\n                if remote_addr is None and request:\n                    remote_addr = request.remote_addr\n                self.remote_addr = remote_addr\n\n    .. versionadded:: 0.7\n    \"\"\"\n    return _request_ctx_stack.top is not None\n\n\ndef has_app_context():\n    \"\"\"Works like :func:`has_request_context` but for the application\n    context.  You can also just do a boolean check on the\n    :data:`current_app` object instead.\n\n    .. versionadded:: 0.9\n    \"\"\"\n    return _app_ctx_stack.top is not None\n\n\nclass AppContext(object):\n    \"\"\"The application context binds an application object implicitly\n    to the current thread or greenlet, similar to how the\n    :class:`RequestContext` binds request information.  The application\n    context is also implicitly created if a request context is created\n    but the application is not on top of the individual application\n    context.\n    \"\"\"\n\n    def __init__(self, app):\n        self.app = app\n        self.url_adapter = app.create_url_adapter(None)\n        self.g = app.app_ctx_globals_class()\n\n        # Like request context, app contexts can be pushed multiple times\n        # but there a basic \"refcount\" is enough to track them.\n        self._refcnt = 0\n\n    def push(self):\n        \"\"\"Binds the app context to the current context.\"\"\"\n        self._refcnt += 1\n        _app_ctx_stack.push(self)\n        appcontext_pushed.send(self.app)\n\n    def pop(self, exc=None):\n        \"\"\"Pops the app context.\"\"\"\n        self._refcnt -= 1\n        if self._refcnt <= 0:\n            if exc is None:\n                exc = sys.exc_info()[1]\n            self.app.do_teardown_appcontext(exc)\n        rv = _app_ctx_stack.pop()\n        assert rv is self, 'Popped wrong app context.  (%r instead of %r)' \\\n            % (rv, self)\n        appcontext_popped.send(self.app)\n\n    def __enter__(self):\n        self.push()\n        return self\n\n    def __exit__(self, exc_type, exc_value, tb):\n        self.pop(exc_value)\n\n\nclass RequestContext(object):\n    \"\"\"The request context contains all request relevant information.  It is\n    created at the beginning of the request and pushed to the\n    `_request_ctx_stack` and removed at the end of it.  It will create the\n    URL adapter and request object for the WSGI environment provided.\n\n    Do not attempt to use this class directly, instead use\n    :meth:`~flask.Flask.test_request_context` and\n    :meth:`~flask.Flask.request_context` to create this object.\n\n    When the request context is popped, it will evaluate all the\n    functions registered on the application for teardown execution\n    (:meth:`~flask.Flask.teardown_request`).\n\n    The request context is automatically popped at the end of the request\n    for you.  In debug mode the request context is kept around if\n    exceptions happen so that interactive debuggers have a chance to\n    introspect the data.  With 0.4 this can also be forced for requests\n    that did not fail and outside of `DEBUG` mode.  By setting\n    ``'flask._preserve_context'`` to `True` on the WSGI environment the\n    context will not pop itself at the end of the request.  This is used by\n    the :meth:`~flask.Flask.test_client` for example to implement the\n    deferred cleanup functionality.\n\n    You might find this helpful for unittests where you need the\n    information from the context local around for a little longer.  Make\n    sure to properly :meth:`~werkzeug.LocalStack.pop` the stack yourself in\n    that situation, otherwise your unittests will leak memory.\n    \"\"\"\n\n    def __init__(self, app, environ, request=None):\n        self.app = app\n        if request is None:\n            request = app.request_class(environ)\n        self.request = request\n        self.url_adapter = app.create_url_adapter(self.request)\n        self.flashes = None\n        self.session = None\n\n        # Request contexts can be pushed multiple times and interleaved with\n        # other request contexts.  Now only if the last level is popped we\n        # get rid of them.  Additionally if an application context is missing\n        # one is created implicitly so for each level we add this information\n        self._implicit_app_ctx_stack = []\n\n        # indicator if the context was preserved.  Next time another context\n        # is pushed the preserved context is popped.\n        self.preserved = False\n\n        # remembers the exception for pop if there is one in case the context\n        # preservation kicks in.\n        self._preserved_exc = None\n\n        # Functions that should be executed after the request on the response\n        # object.  These will be called before the regular \"after_request\"\n        # functions.\n        self._after_request_functions = []\n\n        self.match_request()\n\n        # XXX: Support for deprecated functionality.  This is going away with\n        # Flask 1.0\n        blueprint = self.request.blueprint\n        if blueprint is not None:\n            # better safe than sorry, we don't want to break code that\n            # already worked\n            bp = app.blueprints.get(blueprint)\n            if bp is not None and blueprint_is_module(bp):\n                self.request._is_old_module = True\n\n    def _get_g(self):\n        return _app_ctx_stack.top.g\n    def _set_g(self, value):\n        _app_ctx_stack.top.g = value\n    g = property(_get_g, _set_g)\n    del _get_g, _set_g\n\n    def copy(self):\n        \"\"\"Creates a copy of this request context with the same request object.\n        This can be used to move a request context to a different greenlet.\n        Because the actual request object is the same this cannot be used to\n        move a request context to a different thread unless access to the\n        request object is locked.\n\n        .. versionadded:: 0.10\n        \"\"\"\n        return self.__class__(self.app,\n            environ=self.request.environ,\n            request=self.request\n        )\n\n    def match_request(self):\n        \"\"\"Can be overridden by a subclass to hook into the matching\n        of the request.\n        \"\"\"\n        try:\n            url_rule, self.request.view_args = \\\n                self.url_adapter.match(return_rule=True)\n            self.request.url_rule = url_rule\n        except HTTPException as e:\n            self.request.routing_exception = e\n\n    def push(self):\n        \"\"\"Binds the request context to the current context.\"\"\"\n        # If an exception occurs in debug mode or if context preservation is\n        # activated under exception situations exactly one context stays\n        # on the stack.  The rationale is that you want to access that\n        # information under debug situations.  However if someone forgets to\n        # pop that context again we want to make sure that on the next push\n        # it's invalidated, otherwise we run at risk that something leaks\n        # memory.  This is usually only a problem in testsuite since this\n        # functionality is not active in production environments.\n        top = _request_ctx_stack.top\n        if top is not None and top.preserved:\n            top.pop(top._preserved_exc)\n\n        # Before we push the request context we have to ensure that there\n        # is an application context.\n        app_ctx = _app_ctx_stack.top\n        if app_ctx is None or app_ctx.app != self.app:\n            app_ctx = self.app.app_context()\n            app_ctx.push()\n            self._implicit_app_ctx_stack.append(app_ctx)\n        else:\n            self._implicit_app_ctx_stack.append(None)\n\n        _request_ctx_stack.push(self)\n\n        # Open the session at the moment that the request context is\n        # available. This allows a custom open_session method to use the\n        # request context (e.g. code that access database information\n        # stored on `g` instead of the appcontext).\n        self.session = self.app.open_session(self.request)\n        if self.session is None:\n            self.session = self.app.make_null_session()\n\n    def pop(self, exc=None):\n        \"\"\"Pops the request context and unbinds it by doing that.  This will\n        also trigger the execution of functions registered by the\n        :meth:`~flask.Flask.teardown_request` decorator.\n\n        .. versionchanged:: 0.9\n           Added the `exc` argument.\n        \"\"\"\n        app_ctx = self._implicit_app_ctx_stack.pop()\n\n        clear_request = False\n        if not self._implicit_app_ctx_stack:\n            self.preserved = False\n            self._preserved_exc = None\n            if exc is None:\n                exc = sys.exc_info()[1]\n            self.app.do_teardown_request(exc)\n\n            # If this interpreter supports clearing the exception information\n            # we do that now.  This will only go into effect on Python 2.x,\n            # on 3.x it disappears automatically at the end of the exception\n            # stack.\n            if hasattr(sys, 'exc_clear'):\n                sys.exc_clear()\n\n            request_close = getattr(self.request, 'close', None)\n            if request_close is not None:\n                request_close()\n            clear_request = True\n\n        rv = _request_ctx_stack.pop()\n        assert rv is self, 'Popped wrong request context.  (%r instead of %r)' \\\n            % (rv, self)\n\n        # get rid of circular dependencies at the end of the request\n        # so that we don't require the GC to be active.\n        if clear_request:\n            rv.request.environ['werkzeug.request'] = None\n\n        # Get rid of the app as well if necessary.\n        if app_ctx is not None:\n            app_ctx.pop(exc)\n\n    def auto_pop(self, exc):\n        if self.request.environ.get('flask._preserve_context') or \\\n           (exc is not None and self.app.preserve_context_on_exception):\n            self.preserved = True\n            self._preserved_exc = exc\n        else:\n            self.pop(exc)\n\n    def __enter__(self):\n        self.push()\n        return self\n\n    def __exit__(self, exc_type, exc_value, tb):\n        # do not pop the request stack if we are in debug mode and an\n        # exception happened.  This will allow the debugger to still\n        # access the request object in the interactive shell.  Furthermore\n        # the context can be force kept alive for the test client.\n        # See flask.testing for how this works.\n        self.auto_pop(exc_value)\n\n    def __repr__(self):\n        return '<%s \\'%s\\' [%s] of %s>' % (\n            self.__class__.__name__,\n            self.request.url,\n            self.request.method,\n            self.app.name,\n        )\n"
  },
  {
    "path": "lib/flask/debughelpers.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    flask.debughelpers\n    ~~~~~~~~~~~~~~~~~~\n\n    Various helpers to make the development experience better.\n\n    :copyright: (c) 2011 by Armin Ronacher.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nfrom ._compat import implements_to_string\n\n\nclass UnexpectedUnicodeError(AssertionError, UnicodeError):\n    \"\"\"Raised in places where we want some better error reporting for\n    unexpected unicode or binary data.\n    \"\"\"\n\n\n@implements_to_string\nclass DebugFilesKeyError(KeyError, AssertionError):\n    \"\"\"Raised from request.files during debugging.  The idea is that it can\n    provide a better error message than just a generic KeyError/BadRequest.\n    \"\"\"\n\n    def __init__(self, request, key):\n        form_matches = request.form.getlist(key)\n        buf = ['You tried to access the file \"%s\" in the request.files '\n               'dictionary but it does not exist.  The mimetype for the request '\n               'is \"%s\" instead of \"multipart/form-data\" which means that no '\n               'file contents were transmitted.  To fix this error you should '\n               'provide enctype=\"multipart/form-data\" in your form.' %\n               (key, request.mimetype)]\n        if form_matches:\n            buf.append('\\n\\nThe browser instead transmitted some file names. '\n                       'This was submitted: %s' % ', '.join('\"%s\"' % x\n                            for x in form_matches))\n        self.msg = ''.join(buf)\n\n    def __str__(self):\n        return self.msg\n\n\nclass FormDataRoutingRedirect(AssertionError):\n    \"\"\"This exception is raised by Flask in debug mode if it detects a\n    redirect caused by the routing system when the request method is not\n    GET, HEAD or OPTIONS.  Reasoning: form data will be dropped.\n    \"\"\"\n\n    def __init__(self, request):\n        exc = request.routing_exception\n        buf = ['A request was sent to this URL (%s) but a redirect was '\n               'issued automatically by the routing system to \"%s\".'\n               % (request.url, exc.new_url)]\n\n        # In case just a slash was appended we can be extra helpful\n        if request.base_url + '/' == exc.new_url.split('?')[0]:\n            buf.append('  The URL was defined with a trailing slash so '\n                       'Flask will automatically redirect to the URL '\n                       'with the trailing slash if it was accessed '\n                       'without one.')\n\n        buf.append('  Make sure to directly send your %s-request to this URL '\n                   'since we can\\'t make browsers or HTTP clients redirect '\n                   'with form data reliably or without user interaction.' %\n                   request.method)\n        buf.append('\\n\\nNote: this exception is only raised in debug mode')\n        AssertionError.__init__(self, ''.join(buf).encode('utf-8'))\n\n\ndef attach_enctype_error_multidict(request):\n    \"\"\"Since Flask 0.8 we're monkeypatching the files object in case a\n    request is detected that does not use multipart form data but the files\n    object is accessed.\n    \"\"\"\n    oldcls = request.files.__class__\n    class newcls(oldcls):\n        def __getitem__(self, key):\n            try:\n                return oldcls.__getitem__(self, key)\n            except KeyError as e:\n                if key not in request.form:\n                    raise\n                raise DebugFilesKeyError(request, key)\n    newcls.__name__ = oldcls.__name__\n    newcls.__module__ = oldcls.__module__\n    request.files.__class__ = newcls\n"
  },
  {
    "path": "lib/flask/ext/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    flask.ext\n    ~~~~~~~~~\n\n    Redirect imports for extensions.  This module basically makes it possible\n    for us to transition from flaskext.foo to flask_foo without having to\n    force all extensions to upgrade at the same time.\n\n    When a user does ``from flask.ext.foo import bar`` it will attempt to\n    import ``from flask_foo import bar`` first and when that fails it will\n    try to import ``from flaskext.foo import bar``.\n\n    We're switching from namespace packages because it was just too painful for\n    everybody involved.\n\n    :copyright: (c) 2011 by Armin Ronacher.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\n\n\ndef setup():\n    from ..exthook import ExtensionImporter\n    importer = ExtensionImporter(['flask_%s', 'flaskext.%s'], __name__)\n    importer.install()\n\n\nsetup()\ndel setup\n"
  },
  {
    "path": "lib/flask/exthook.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    flask.exthook\n    ~~~~~~~~~~~~~\n\n    Redirect imports for extensions.  This module basically makes it possible\n    for us to transition from flaskext.foo to flask_foo without having to\n    force all extensions to upgrade at the same time.\n\n    When a user does ``from flask.ext.foo import bar`` it will attempt to\n    import ``from flask_foo import bar`` first and when that fails it will\n    try to import ``from flaskext.foo import bar``.\n\n    We're switching from namespace packages because it was just too painful for\n    everybody involved.\n\n    This is used by `flask.ext`.\n\n    :copyright: (c) 2011 by Armin Ronacher.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nimport sys\nimport os\nfrom ._compat import reraise\n\n\nclass ExtensionImporter(object):\n    \"\"\"This importer redirects imports from this submodule to other locations.\n    This makes it possible to transition from the old flaskext.name to the\n    newer flask_name without people having a hard time.\n    \"\"\"\n\n    def __init__(self, module_choices, wrapper_module):\n        self.module_choices = module_choices\n        self.wrapper_module = wrapper_module\n        self.prefix = wrapper_module + '.'\n        self.prefix_cutoff = wrapper_module.count('.') + 1\n\n    def __eq__(self, other):\n        return self.__class__.__module__ == other.__class__.__module__ and \\\n               self.__class__.__name__ == other.__class__.__name__ and \\\n               self.wrapper_module == other.wrapper_module and \\\n               self.module_choices == other.module_choices\n\n    def __ne__(self, other):\n        return not self.__eq__(other)\n\n    def install(self):\n        sys.meta_path[:] = [x for x in sys.meta_path if self != x] + [self]\n\n    def find_module(self, fullname, path=None):\n        if fullname.startswith(self.prefix):\n            return self\n\n    def load_module(self, fullname):\n        if fullname in sys.modules:\n            return sys.modules[fullname]\n        modname = fullname.split('.', self.prefix_cutoff)[self.prefix_cutoff]\n        for path in self.module_choices:\n            realname = path % modname\n            try:\n                __import__(realname)\n            except ImportError:\n                exc_type, exc_value, tb = sys.exc_info()\n                # since we only establish the entry in sys.modules at the\n                # very this seems to be redundant, but if recursive imports\n                # happen we will call into the move import a second time.\n                # On the second invocation we still don't have an entry for\n                # fullname in sys.modules, but we will end up with the same\n                # fake module name and that import will succeed since this\n                # one already has a temporary entry in the modules dict.\n                # Since this one \"succeeded\" temporarily that second\n                # invocation now will have created a fullname entry in\n                # sys.modules which we have to kill.\n                sys.modules.pop(fullname, None)\n\n                # If it's an important traceback we reraise it, otherwise\n                # we swallow it and try the next choice.  The skipped frame\n                # is the one from __import__ above which we don't care about\n                if self.is_important_traceback(realname, tb):\n                    reraise(exc_type, exc_value, tb.tb_next)\n                continue\n            module = sys.modules[fullname] = sys.modules[realname]\n            if '.' not in modname:\n                setattr(sys.modules[self.wrapper_module], modname, module)\n            return module\n        raise ImportError('No module named %s' % fullname)\n\n    def is_important_traceback(self, important_module, tb):\n        \"\"\"Walks a traceback's frames and checks if any of the frames\n        originated in the given important module.  If that is the case then we\n        were able to import the module itself but apparently something went\n        wrong when the module was imported.  (Eg: import of an import failed).\n        \"\"\"\n        while tb is not None:\n            if self.is_important_frame(important_module, tb):\n                return True\n            tb = tb.tb_next\n        return False\n\n    def is_important_frame(self, important_module, tb):\n        \"\"\"Checks a single frame if it's important.\"\"\"\n        g = tb.tb_frame.f_globals\n        if '__name__' not in g:\n            return False\n\n        module_name = g['__name__']\n\n        # Python 2.7 Behavior.  Modules are cleaned up late so the\n        # name shows up properly here.  Success!\n        if module_name == important_module:\n            return True\n\n        # Some python versions will will clean up modules so early that the\n        # module name at that point is no longer set.  Try guessing from\n        # the filename then.\n        filename = os.path.abspath(tb.tb_frame.f_code.co_filename)\n        test_string = os.path.sep + important_module.replace('.', os.path.sep)\n        return test_string + '.py' in filename or \\\n               test_string + os.path.sep + '__init__.py' in filename\n"
  },
  {
    "path": "lib/flask/globals.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    flask.globals\n    ~~~~~~~~~~~~~\n\n    Defines all the global objects that are proxies to the current\n    active context.\n\n    :copyright: (c) 2011 by Armin Ronacher.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\n\nfrom functools import partial\nfrom werkzeug.local import LocalStack, LocalProxy\n\n\ndef _lookup_req_object(name):\n    top = _request_ctx_stack.top\n    if top is None:\n        raise RuntimeError('working outside of request context')\n    return getattr(top, name)\n\n\ndef _lookup_app_object(name):\n    top = _app_ctx_stack.top\n    if top is None:\n        raise RuntimeError('working outside of application context')\n    return getattr(top, name)\n\n\ndef _find_app():\n    top = _app_ctx_stack.top\n    if top is None:\n        raise RuntimeError('working outside of application context')\n    return top.app\n\n\n# context locals\n_request_ctx_stack = LocalStack()\n_app_ctx_stack = LocalStack()\ncurrent_app = LocalProxy(_find_app)\nrequest = LocalProxy(partial(_lookup_req_object, 'request'))\nsession = LocalProxy(partial(_lookup_req_object, 'session'))\ng = LocalProxy(partial(_lookup_app_object, 'g'))\n"
  },
  {
    "path": "lib/flask/helpers.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    flask.helpers\n    ~~~~~~~~~~~~~\n\n    Implements various helpers.\n\n    :copyright: (c) 2011 by Armin Ronacher.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\n\nimport os\nimport sys\nimport pkgutil\nimport posixpath\nimport mimetypes\nfrom time import time\nfrom zlib import adler32\nfrom threading import RLock\nfrom werkzeug.routing import BuildError\nfrom functools import update_wrapper\n\ntry:\n    from werkzeug.urls import url_quote\nexcept ImportError:\n    from urlparse import quote as url_quote\n\nfrom werkzeug.datastructures import Headers\nfrom werkzeug.exceptions import NotFound\n\n# this was moved in 0.7\ntry:\n    from werkzeug.wsgi import wrap_file\nexcept ImportError:\n    from werkzeug.utils import wrap_file\n\nfrom jinja2 import FileSystemLoader\n\nfrom .signals import message_flashed\nfrom .globals import session, _request_ctx_stack, _app_ctx_stack, \\\n     current_app, request\nfrom ._compat import string_types, text_type\n\n\n# sentinel\n_missing = object()\n\n\n# what separators does this operating system provide that are not a slash?\n# this is used by the send_from_directory function to ensure that nobody is\n# able to access files from outside the filesystem.\n_os_alt_seps = list(sep for sep in [os.path.sep, os.path.altsep]\n                    if sep not in (None, '/'))\n\n\ndef _endpoint_from_view_func(view_func):\n    \"\"\"Internal helper that returns the default endpoint for a given\n    function.  This always is the function name.\n    \"\"\"\n    assert view_func is not None, 'expected view func if endpoint ' \\\n                                  'is not provided.'\n    return view_func.__name__\n\n\ndef stream_with_context(generator_or_function):\n    \"\"\"Request contexts disappear when the response is started on the server.\n    This is done for efficiency reasons and to make it less likely to encounter\n    memory leaks with badly written WSGI middlewares.  The downside is that if\n    you are using streamed responses, the generator cannot access request bound\n    information any more.\n\n    This function however can help you keep the context around for longer::\n\n        from flask import stream_with_context, request, Response\n\n        @app.route('/stream')\n        def streamed_response():\n            @stream_with_context\n            def generate():\n                yield 'Hello '\n                yield request.args['name']\n                yield '!'\n            return Response(generate())\n\n    Alternatively it can also be used around a specific generator::\n\n        from flask import stream_with_context, request, Response\n\n        @app.route('/stream')\n        def streamed_response():\n            def generate():\n                yield 'Hello '\n                yield request.args['name']\n                yield '!'\n            return Response(stream_with_context(generate()))\n\n    .. versionadded:: 0.9\n    \"\"\"\n    try:\n        gen = iter(generator_or_function)\n    except TypeError:\n        def decorator(*args, **kwargs):\n            gen = generator_or_function()\n            return stream_with_context(gen)\n        return update_wrapper(decorator, generator_or_function)\n\n    def generator():\n        ctx = _request_ctx_stack.top\n        if ctx is None:\n            raise RuntimeError('Attempted to stream with context but '\n                'there was no context in the first place to keep around.')\n        with ctx:\n            # Dummy sentinel.  Has to be inside the context block or we're\n            # not actually keeping the context around.\n            yield None\n\n            # The try/finally is here so that if someone passes a WSGI level\n            # iterator in we're still running the cleanup logic.  Generators\n            # don't need that because they are closed on their destruction\n            # automatically.\n            try:\n                for item in gen:\n                    yield item\n            finally:\n                if hasattr(gen, 'close'):\n                    gen.close()\n\n    # The trick is to start the generator.  Then the code execution runs until\n    # the first dummy None is yielded at which point the context was already\n    # pushed.  This item is discarded.  Then when the iteration continues the\n    # real generator is executed.\n    wrapped_g = generator()\n    next(wrapped_g)\n    return wrapped_g\n\n\ndef make_response(*args):\n    \"\"\"Sometimes it is necessary to set additional headers in a view.  Because\n    views do not have to return response objects but can return a value that\n    is converted into a response object by Flask itself, it becomes tricky to\n    add headers to it.  This function can be called instead of using a return\n    and you will get a response object which you can use to attach headers.\n\n    If view looked like this and you want to add a new header::\n\n        def index():\n            return render_template('index.html', foo=42)\n\n    You can now do something like this::\n\n        def index():\n            response = make_response(render_template('index.html', foo=42))\n            response.headers['X-Parachutes'] = 'parachutes are cool'\n            return response\n\n    This function accepts the very same arguments you can return from a\n    view function.  This for example creates a response with a 404 error\n    code::\n\n        response = make_response(render_template('not_found.html'), 404)\n\n    The other use case of this function is to force the return value of a\n    view function into a response which is helpful with view\n    decorators::\n\n        response = make_response(view_function())\n        response.headers['X-Parachutes'] = 'parachutes are cool'\n\n    Internally this function does the following things:\n\n    -   if no arguments are passed, it creates a new response argument\n    -   if one argument is passed, :meth:`flask.Flask.make_response`\n        is invoked with it.\n    -   if more than one argument is passed, the arguments are passed\n        to the :meth:`flask.Flask.make_response` function as tuple.\n\n    .. versionadded:: 0.6\n    \"\"\"\n    if not args:\n        return current_app.response_class()\n    if len(args) == 1:\n        args = args[0]\n    return current_app.make_response(args)\n\n\ndef url_for(endpoint, **values):\n    \"\"\"Generates a URL to the given endpoint with the method provided.\n\n    Variable arguments that are unknown to the target endpoint are appended\n    to the generated URL as query arguments.  If the value of a query argument\n    is `None`, the whole pair is skipped.  In case blueprints are active\n    you can shortcut references to the same blueprint by prefixing the\n    local endpoint with a dot (``.``).\n\n    This will reference the index function local to the current blueprint::\n\n        url_for('.index')\n\n    For more information, head over to the :ref:`Quickstart <url-building>`.\n\n    To integrate applications, :class:`Flask` has a hook to intercept URL build\n    errors through :attr:`Flask.build_error_handler`.  The `url_for` function\n    results in a :exc:`~werkzeug.routing.BuildError` when the current app does\n    not have a URL for the given endpoint and values.  When it does, the\n    :data:`~flask.current_app` calls its :attr:`~Flask.build_error_handler` if\n    it is not `None`, which can return a string to use as the result of\n    `url_for` (instead of `url_for`'s default to raise the\n    :exc:`~werkzeug.routing.BuildError` exception) or re-raise the exception.\n    An example::\n\n        def external_url_handler(error, endpoint, **values):\n            \"Looks up an external URL when `url_for` cannot build a URL.\"\n            # This is an example of hooking the build_error_handler.\n            # Here, lookup_url is some utility function you've built\n            # which looks up the endpoint in some external URL registry.\n            url = lookup_url(endpoint, **values)\n            if url is None:\n                # External lookup did not have a URL.\n                # Re-raise the BuildError, in context of original traceback.\n                exc_type, exc_value, tb = sys.exc_info()\n                if exc_value is error:\n                    raise exc_type, exc_value, tb\n                else:\n                    raise error\n            # url_for will use this result, instead of raising BuildError.\n            return url\n\n        app.build_error_handler = external_url_handler\n\n    Here, `error` is the instance of :exc:`~werkzeug.routing.BuildError`, and\n    `endpoint` and `**values` are the arguments passed into `url_for`.  Note\n    that this is for building URLs outside the current application, and not for\n    handling 404 NotFound errors.\n\n    .. versionadded:: 0.10\n       The `_scheme` parameter was added.\n\n    .. versionadded:: 0.9\n       The `_anchor` and `_method` parameters were added.\n\n    .. versionadded:: 0.9\n       Calls :meth:`Flask.handle_build_error` on\n       :exc:`~werkzeug.routing.BuildError`.\n\n    :param endpoint: the endpoint of the URL (name of the function)\n    :param values: the variable arguments of the URL rule\n    :param _external: if set to `True`, an absolute URL is generated. Server\n      address can be changed via `SERVER_NAME` configuration variable which\n      defaults to `localhost`.\n    :param _scheme: a string specifying the desired URL scheme. The `_external`\n      parameter must be set to `True` or a `ValueError` is raised.\n    :param _anchor: if provided this is added as anchor to the URL.\n    :param _method: if provided this explicitly specifies an HTTP method.\n    \"\"\"\n    appctx = _app_ctx_stack.top\n    reqctx = _request_ctx_stack.top\n    if appctx is None:\n        raise RuntimeError('Attempted to generate a URL without the '\n                           'application context being pushed. This has to be '\n                           'executed when application context is available.')\n\n    # If request specific information is available we have some extra\n    # features that support \"relative\" urls.\n    if reqctx is not None:\n        url_adapter = reqctx.url_adapter\n        blueprint_name = request.blueprint\n        if not reqctx.request._is_old_module:\n            if endpoint[:1] == '.':\n                if blueprint_name is not None:\n                    endpoint = blueprint_name + endpoint\n                else:\n                    endpoint = endpoint[1:]\n        else:\n            # TODO: get rid of this deprecated functionality in 1.0\n            if '.' not in endpoint:\n                if blueprint_name is not None:\n                    endpoint = blueprint_name + '.' + endpoint\n            elif endpoint.startswith('.'):\n                endpoint = endpoint[1:]\n        external = values.pop('_external', False)\n\n    # Otherwise go with the url adapter from the appctx and make\n    # the urls external by default.\n    else:\n        url_adapter = appctx.url_adapter\n        if url_adapter is None:\n            raise RuntimeError('Application was not able to create a URL '\n                               'adapter for request independent URL generation. '\n                               'You might be able to fix this by setting '\n                               'the SERVER_NAME config variable.')\n        external = values.pop('_external', True)\n\n    anchor = values.pop('_anchor', None)\n    method = values.pop('_method', None)\n    scheme = values.pop('_scheme', None)\n    appctx.app.inject_url_defaults(endpoint, values)\n\n    if scheme is not None:\n        if not external:\n            raise ValueError('When specifying _scheme, _external must be True')\n        url_adapter.url_scheme = scheme\n\n    try:\n        rv = url_adapter.build(endpoint, values, method=method,\n                               force_external=external)\n    except BuildError as error:\n        # We need to inject the values again so that the app callback can\n        # deal with that sort of stuff.\n        values['_external'] = external\n        values['_anchor'] = anchor\n        values['_method'] = method\n        return appctx.app.handle_url_build_error(error, endpoint, values)\n\n    if anchor is not None:\n        rv += '#' + url_quote(anchor)\n    return rv\n\n\ndef get_template_attribute(template_name, attribute):\n    \"\"\"Loads a macro (or variable) a template exports.  This can be used to\n    invoke a macro from within Python code.  If you for example have a\n    template named `_cider.html` with the following contents:\n\n    .. sourcecode:: html+jinja\n\n       {% macro hello(name) %}Hello {{ name }}!{% endmacro %}\n\n    You can access this from Python code like this::\n\n        hello = get_template_attribute('_cider.html', 'hello')\n        return hello('World')\n\n    .. versionadded:: 0.2\n\n    :param template_name: the name of the template\n    :param attribute: the name of the variable of macro to access\n    \"\"\"\n    return getattr(current_app.jinja_env.get_template(template_name).module,\n                   attribute)\n\n\ndef flash(message, category='message'):\n    \"\"\"Flashes a message to the next request.  In order to remove the\n    flashed message from the session and to display it to the user,\n    the template has to call :func:`get_flashed_messages`.\n\n    .. versionchanged:: 0.3\n       `category` parameter added.\n\n    :param message: the message to be flashed.\n    :param category: the category for the message.  The following values\n                     are recommended: ``'message'`` for any kind of message,\n                     ``'error'`` for errors, ``'info'`` for information\n                     messages and ``'warning'`` for warnings.  However any\n                     kind of string can be used as category.\n    \"\"\"\n    # Original implementation:\n    #\n    #     session.setdefault('_flashes', []).append((category, message))\n    #\n    # This assumed that changes made to mutable structures in the session are\n    # are always in sync with the sess on object, which is not true for session\n    # implementations that use external storage for keeping their keys/values.\n    flashes = session.get('_flashes', [])\n    flashes.append((category, message))\n    session['_flashes'] = flashes\n    message_flashed.send(current_app._get_current_object(),\n                         message=message, category=category)\n\n\ndef get_flashed_messages(with_categories=False, category_filter=[]):\n    \"\"\"Pulls all flashed messages from the session and returns them.\n    Further calls in the same request to the function will return\n    the same messages.  By default just the messages are returned,\n    but when `with_categories` is set to `True`, the return value will\n    be a list of tuples in the form ``(category, message)`` instead.\n\n    Filter the flashed messages to one or more categories by providing those\n    categories in `category_filter`.  This allows rendering categories in\n    separate html blocks.  The `with_categories` and `category_filter`\n    arguments are distinct:\n\n    * `with_categories` controls whether categories are returned with message\n      text (`True` gives a tuple, where `False` gives just the message text).\n    * `category_filter` filters the messages down to only those matching the\n      provided categories.\n\n    See :ref:`message-flashing-pattern` for examples.\n\n    .. versionchanged:: 0.3\n       `with_categories` parameter added.\n\n    .. versionchanged:: 0.9\n        `category_filter` parameter added.\n\n    :param with_categories: set to `True` to also receive categories.\n    :param category_filter: whitelist of categories to limit return values\n    \"\"\"\n    flashes = _request_ctx_stack.top.flashes\n    if flashes is None:\n        _request_ctx_stack.top.flashes = flashes = session.pop('_flashes') \\\n            if '_flashes' in session else []\n    if category_filter:\n        flashes = list(filter(lambda f: f[0] in category_filter, flashes))\n    if not with_categories:\n        return [x[1] for x in flashes]\n    return flashes\n\n\ndef send_file(filename_or_fp, mimetype=None, as_attachment=False,\n              attachment_filename=None, add_etags=True,\n              cache_timeout=None, conditional=False):\n    \"\"\"Sends the contents of a file to the client.  This will use the\n    most efficient method available and configured.  By default it will\n    try to use the WSGI server's file_wrapper support.  Alternatively\n    you can set the application's :attr:`~Flask.use_x_sendfile` attribute\n    to ``True`` to directly emit an `X-Sendfile` header.  This however\n    requires support of the underlying webserver for `X-Sendfile`.\n\n    By default it will try to guess the mimetype for you, but you can\n    also explicitly provide one.  For extra security you probably want\n    to send certain files as attachment (HTML for instance).  The mimetype\n    guessing requires a `filename` or an `attachment_filename` to be\n    provided.\n\n    Please never pass filenames to this function from user sources without\n    checking them first.  Something like this is usually sufficient to\n    avoid security problems::\n\n        if '..' in filename or filename.startswith('/'):\n            abort(404)\n\n    .. versionadded:: 0.2\n\n    .. versionadded:: 0.5\n       The `add_etags`, `cache_timeout` and `conditional` parameters were\n       added.  The default behavior is now to attach etags.\n\n    .. versionchanged:: 0.7\n       mimetype guessing and etag support for file objects was\n       deprecated because it was unreliable.  Pass a filename if you are\n       able to, otherwise attach an etag yourself.  This functionality\n       will be removed in Flask 1.0\n\n    .. versionchanged:: 0.9\n       cache_timeout pulls its default from application config, when None.\n\n    :param filename_or_fp: the filename of the file to send.  This is\n                           relative to the :attr:`~Flask.root_path` if a\n                           relative path is specified.\n                           Alternatively a file object might be provided\n                           in which case `X-Sendfile` might not work and\n                           fall back to the traditional method.  Make sure\n                           that the file pointer is positioned at the start\n                           of data to send before calling :func:`send_file`.\n    :param mimetype: the mimetype of the file if provided, otherwise\n                     auto detection happens.\n    :param as_attachment: set to `True` if you want to send this file with\n                          a ``Content-Disposition: attachment`` header.\n    :param attachment_filename: the filename for the attachment if it\n                                differs from the file's filename.\n    :param add_etags: set to `False` to disable attaching of etags.\n    :param conditional: set to `True` to enable conditional responses.\n\n    :param cache_timeout: the timeout in seconds for the headers. When `None`\n                          (default), this value is set by\n                          :meth:`~Flask.get_send_file_max_age` of\n                          :data:`~flask.current_app`.\n    \"\"\"\n    mtime = None\n    if isinstance(filename_or_fp, string_types):\n        filename = filename_or_fp\n        file = None\n    else:\n        from warnings import warn\n        file = filename_or_fp\n        filename = getattr(file, 'name', None)\n\n        # XXX: this behavior is now deprecated because it was unreliable.\n        # removed in Flask 1.0\n        if not attachment_filename and not mimetype \\\n           and isinstance(filename, string_types):\n            warn(DeprecationWarning('The filename support for file objects '\n                'passed to send_file is now deprecated.  Pass an '\n                'attach_filename if you want mimetypes to be guessed.'),\n                stacklevel=2)\n        if add_etags:\n            warn(DeprecationWarning('In future flask releases etags will no '\n                'longer be generated for file objects passed to the send_file '\n                'function because this behavior was unreliable.  Pass '\n                'filenames instead if possible, otherwise attach an etag '\n                'yourself based on another value'), stacklevel=2)\n\n    if filename is not None:\n        if not os.path.isabs(filename):\n            filename = os.path.join(current_app.root_path, filename)\n    if mimetype is None and (filename or attachment_filename):\n        mimetype = mimetypes.guess_type(filename or attachment_filename)[0]\n    if mimetype is None:\n        mimetype = 'application/octet-stream'\n\n    headers = Headers()\n    if as_attachment:\n        if attachment_filename is None:\n            if filename is None:\n                raise TypeError('filename unavailable, required for '\n                                'sending as attachment')\n            attachment_filename = os.path.basename(filename)\n        headers.add('Content-Disposition', 'attachment',\n                    filename=attachment_filename)\n\n    if current_app.use_x_sendfile and filename:\n        if file is not None:\n            file.close()\n        headers['X-Sendfile'] = filename\n        headers['Content-Length'] = os.path.getsize(filename)\n        data = None\n    else:\n        if file is None:\n            file = open(filename, 'rb')\n            mtime = os.path.getmtime(filename)\n            headers['Content-Length'] = os.path.getsize(filename)\n        data = wrap_file(request.environ, file)\n\n    rv = current_app.response_class(data, mimetype=mimetype, headers=headers,\n                                    direct_passthrough=True)\n\n    # if we know the file modification date, we can store it as the\n    # the time of the last modification.\n    if mtime is not None:\n        rv.last_modified = int(mtime)\n\n    rv.cache_control.public = True\n    if cache_timeout is None:\n        cache_timeout = current_app.get_send_file_max_age(filename)\n    if cache_timeout is not None:\n        rv.cache_control.max_age = cache_timeout\n        rv.expires = int(time() + cache_timeout)\n\n    if add_etags and filename is not None:\n        rv.set_etag('flask-%s-%s-%s' % (\n            os.path.getmtime(filename),\n            os.path.getsize(filename),\n            adler32(\n                filename.encode('utf-8') if isinstance(filename, text_type)\n                else filename\n            ) & 0xffffffff\n        ))\n        if conditional:\n            rv = rv.make_conditional(request)\n            # make sure we don't send x-sendfile for servers that\n            # ignore the 304 status code for x-sendfile.\n            if rv.status_code == 304:\n                rv.headers.pop('x-sendfile', None)\n    return rv\n\n\ndef safe_join(directory, filename):\n    \"\"\"Safely join `directory` and `filename`.\n\n    Example usage::\n\n        @app.route('/wiki/<path:filename>')\n        def wiki_page(filename):\n            filename = safe_join(app.config['WIKI_FOLDER'], filename)\n            with open(filename, 'rb') as fd:\n                content = fd.read() # Read and process the file content...\n\n    :param directory: the base directory.\n    :param filename: the untrusted filename relative to that directory.\n    :raises: :class:`~werkzeug.exceptions.NotFound` if the resulting path\n             would fall out of `directory`.\n    \"\"\"\n    filename = posixpath.normpath(filename)\n    for sep in _os_alt_seps:\n        if sep in filename:\n            raise NotFound()\n    if os.path.isabs(filename) or \\\n       filename == '..' or \\\n       filename.startswith('../'):\n        raise NotFound()\n    return os.path.join(directory, filename)\n\n\ndef send_from_directory(directory, filename, **options):\n    \"\"\"Send a file from a given directory with :func:`send_file`.  This\n    is a secure way to quickly expose static files from an upload folder\n    or something similar.\n\n    Example usage::\n\n        @app.route('/uploads/<path:filename>')\n        def download_file(filename):\n            return send_from_directory(app.config['UPLOAD_FOLDER'],\n                                       filename, as_attachment=True)\n\n    .. admonition:: Sending files and Performance\n\n       It is strongly recommended to activate either `X-Sendfile` support in\n       your webserver or (if no authentication happens) to tell the webserver\n       to serve files for the given path on its own without calling into the\n       web application for improved performance.\n\n    .. versionadded:: 0.5\n\n    :param directory: the directory where all the files are stored.\n    :param filename: the filename relative to that directory to\n                     download.\n    :param options: optional keyword arguments that are directly\n                    forwarded to :func:`send_file`.\n    \"\"\"\n    filename = safe_join(directory, filename)\n    if not os.path.isfile(filename):\n        raise NotFound()\n    options.setdefault('conditional', True)\n    return send_file(filename, **options)\n\n\ndef get_root_path(import_name):\n    \"\"\"Returns the path to a package or cwd if that cannot be found.  This\n    returns the path of a package or the folder that contains a module.\n\n    Not to be confused with the package path returned by :func:`find_package`.\n    \"\"\"\n    # Module already imported and has a file attribute.  Use that first.\n    mod = sys.modules.get(import_name)\n    if mod is not None and hasattr(mod, '__file__'):\n        return os.path.dirname(os.path.abspath(mod.__file__))\n\n    # Next attempt: check the loader.\n    loader = pkgutil.get_loader(import_name)\n\n    # Loader does not exist or we're referring to an unloaded main module\n    # or a main module without path (interactive sessions), go with the\n    # current working directory.\n    if loader is None or import_name == '__main__':\n        return os.getcwd()\n\n    # For .egg, zipimporter does not have get_filename until Python 2.7.\n    # Some other loaders might exhibit the same behavior.\n    if hasattr(loader, 'get_filename'):\n        filepath = loader.get_filename(import_name)\n    else:\n        # Fall back to imports.\n        __import__(import_name)\n        filepath = sys.modules[import_name].__file__\n\n    # filepath is import_name.py for a module, or __init__.py for a package.\n    return os.path.dirname(os.path.abspath(filepath))\n\n\ndef find_package(import_name):\n    \"\"\"Finds a package and returns the prefix (or None if the package is\n    not installed) as well as the folder that contains the package or\n    module as a tuple.  The package path returned is the module that would\n    have to be added to the pythonpath in order to make it possible to\n    import the module.  The prefix is the path below which a UNIX like\n    folder structure exists (lib, share etc.).\n    \"\"\"\n    root_mod_name = import_name.split('.')[0]\n    loader = pkgutil.get_loader(root_mod_name)\n    if loader is None or import_name == '__main__':\n        # import name is not found, or interactive/main module\n        package_path = os.getcwd()\n    else:\n        # For .egg, zipimporter does not have get_filename until Python 2.7.\n        if hasattr(loader, 'get_filename'):\n            filename = loader.get_filename(root_mod_name)\n        elif hasattr(loader, 'archive'):\n            # zipimporter's loader.archive points to the .egg or .zip\n            # archive filename is dropped in call to dirname below.\n            filename = loader.archive\n        else:\n            # At least one loader is missing both get_filename and archive:\n            # Google App Engine's HardenedModulesHook\n            #\n            # Fall back to imports.\n            __import__(import_name)\n            filename = sys.modules[import_name].__file__\n        package_path = os.path.abspath(os.path.dirname(filename))\n        # package_path ends with __init__.py for a package\n        if loader.is_package(root_mod_name):\n            package_path = os.path.dirname(package_path)\n\n    site_parent, site_folder = os.path.split(package_path)\n    py_prefix = os.path.abspath(sys.prefix)\n    if package_path.startswith(py_prefix):\n        return py_prefix, package_path\n    elif site_folder.lower() == 'site-packages':\n        parent, folder = os.path.split(site_parent)\n        # Windows like installations\n        if folder.lower() == 'lib':\n            base_dir = parent\n        # UNIX like installations\n        elif os.path.basename(parent).lower() == 'lib':\n            base_dir = os.path.dirname(parent)\n        else:\n            base_dir = site_parent\n        return base_dir, package_path\n    return None, package_path\n\n\nclass locked_cached_property(object):\n    \"\"\"A decorator that converts a function into a lazy property.  The\n    function wrapped is called the first time to retrieve the result\n    and then that calculated result is used the next time you access\n    the value.  Works like the one in Werkzeug but has a lock for\n    thread safety.\n    \"\"\"\n\n    def __init__(self, func, name=None, doc=None):\n        self.__name__ = name or func.__name__\n        self.__module__ = func.__module__\n        self.__doc__ = doc or func.__doc__\n        self.func = func\n        self.lock = RLock()\n\n    def __get__(self, obj, type=None):\n        if obj is None:\n            return self\n        with self.lock:\n            value = obj.__dict__.get(self.__name__, _missing)\n            if value is _missing:\n                value = self.func(obj)\n                obj.__dict__[self.__name__] = value\n            return value\n\n\nclass _PackageBoundObject(object):\n\n    def __init__(self, import_name, template_folder=None):\n        #: The name of the package or module.  Do not change this once\n        #: it was set by the constructor.\n        self.import_name = import_name\n\n        #: location of the templates.  `None` if templates should not be\n        #: exposed.\n        self.template_folder = template_folder\n\n        #: Where is the app root located?\n        self.root_path = get_root_path(self.import_name)\n\n        self._static_folder = None\n        self._static_url_path = None\n\n    def _get_static_folder(self):\n        if self._static_folder is not None:\n            return os.path.join(self.root_path, self._static_folder)\n    def _set_static_folder(self, value):\n        self._static_folder = value\n    static_folder = property(_get_static_folder, _set_static_folder)\n    del _get_static_folder, _set_static_folder\n\n    def _get_static_url_path(self):\n        if self._static_url_path is None:\n            if self.static_folder is None:\n                return None\n            return '/' + os.path.basename(self.static_folder)\n        return self._static_url_path\n    def _set_static_url_path(self, value):\n        self._static_url_path = value\n    static_url_path = property(_get_static_url_path, _set_static_url_path)\n    del _get_static_url_path, _set_static_url_path\n\n    @property\n    def has_static_folder(self):\n        \"\"\"This is `True` if the package bound object's container has a\n        folder named ``'static'``.\n\n        .. versionadded:: 0.5\n        \"\"\"\n        return self.static_folder is not None\n\n    @locked_cached_property\n    def jinja_loader(self):\n        \"\"\"The Jinja loader for this package bound object.\n\n        .. versionadded:: 0.5\n        \"\"\"\n        if self.template_folder is not None:\n            return FileSystemLoader(os.path.join(self.root_path,\n                                                 self.template_folder))\n\n    def get_send_file_max_age(self, filename):\n        \"\"\"Provides default cache_timeout for the :func:`send_file` functions.\n\n        By default, this function returns ``SEND_FILE_MAX_AGE_DEFAULT`` from\n        the configuration of :data:`~flask.current_app`.\n\n        Static file functions such as :func:`send_from_directory` use this\n        function, and :func:`send_file` calls this function on\n        :data:`~flask.current_app` when the given cache_timeout is `None`. If a\n        cache_timeout is given in :func:`send_file`, that timeout is used;\n        otherwise, this method is called.\n\n        This allows subclasses to change the behavior when sending files based\n        on the filename.  For example, to set the cache timeout for .js files\n        to 60 seconds::\n\n            class MyFlask(flask.Flask):\n                def get_send_file_max_age(self, name):\n                    if name.lower().endswith('.js'):\n                        return 60\n                    return flask.Flask.get_send_file_max_age(self, name)\n\n        .. versionadded:: 0.9\n        \"\"\"\n        return current_app.config['SEND_FILE_MAX_AGE_DEFAULT']\n\n    def send_static_file(self, filename):\n        \"\"\"Function used internally to send static files from the static\n        folder to the browser.\n\n        .. versionadded:: 0.5\n        \"\"\"\n        if not self.has_static_folder:\n            raise RuntimeError('No static folder for this object')\n        # Ensure get_send_file_max_age is called in all cases.\n        # Here, we ensure get_send_file_max_age is called for Blueprints.\n        cache_timeout = self.get_send_file_max_age(filename)\n        return send_from_directory(self.static_folder, filename,\n                                   cache_timeout=cache_timeout)\n\n    def open_resource(self, resource, mode='rb'):\n        \"\"\"Opens a resource from the application's resource folder.  To see\n        how this works, consider the following folder structure::\n\n            /myapplication.py\n            /schema.sql\n            /static\n                /style.css\n            /templates\n                /layout.html\n                /index.html\n\n        If you want to open the `schema.sql` file you would do the\n        following::\n\n            with app.open_resource('schema.sql') as f:\n                contents = f.read()\n                do_something_with(contents)\n\n        :param resource: the name of the resource.  To access resources within\n                         subfolders use forward slashes as separator.\n        :param mode: resource file opening mode, default is 'rb'.\n        \"\"\"\n        if mode not in ('r', 'rb'):\n            raise ValueError('Resources can only be opened for reading')\n        return open(os.path.join(self.root_path, resource), mode)\n"
  },
  {
    "path": "lib/flask/json.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    flask.jsonimpl\n    ~~~~~~~~~~~~~~\n\n    Implementation helpers for the JSON support in Flask.\n\n    :copyright: (c) 2012 by Armin Ronacher.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nimport io\nimport uuid\nfrom datetime import datetime\nfrom .globals import current_app, request\nfrom ._compat import text_type, PY2\n\nfrom werkzeug.http import http_date\nfrom jinja2 import Markup\n\n# Use the same json implementation as itsdangerous on which we\n# depend anyways.\ntry:\n    from itsdangerous import simplejson as _json\nexcept ImportError:\n    from itsdangerous import json as _json\n\n\n# figure out if simplejson escapes slashes.  This behavior was changed\n# from one version to another without reason.\n_slash_escape = '\\\\/' not in _json.dumps('/')\n\n\n__all__ = ['dump', 'dumps', 'load', 'loads', 'htmlsafe_dump',\n           'htmlsafe_dumps', 'JSONDecoder', 'JSONEncoder',\n           'jsonify']\n\n\ndef _wrap_reader_for_text(fp, encoding):\n    if isinstance(fp.read(0), bytes):\n        fp = io.TextIOWrapper(io.BufferedReader(fp), encoding)\n    return fp\n\n\ndef _wrap_writer_for_text(fp, encoding):\n    try:\n        fp.write('')\n    except TypeError:\n        fp = io.TextIOWrapper(fp, encoding)\n    return fp\n\n\nclass JSONEncoder(_json.JSONEncoder):\n    \"\"\"The default Flask JSON encoder.  This one extends the default simplejson\n    encoder by also supporting ``datetime`` objects, ``UUID`` as well as\n    ``Markup`` objects which are serialized as RFC 822 datetime strings (same\n    as the HTTP date format).  In order to support more data types override the\n    :meth:`default` method.\n    \"\"\"\n\n    def default(self, o):\n        \"\"\"Implement this method in a subclass such that it returns a\n        serializable object for ``o``, or calls the base implementation (to\n        raise a ``TypeError``).\n\n        For example, to support arbitrary iterators, you could implement\n        default like this::\n\n            def default(self, o):\n                try:\n                    iterable = iter(o)\n                except TypeError:\n                    pass\n                else:\n                    return list(iterable)\n                return JSONEncoder.default(self, o)\n        \"\"\"\n        if isinstance(o, datetime):\n            return http_date(o)\n        if isinstance(o, uuid.UUID):\n            return str(o)\n        if hasattr(o, '__html__'):\n            return text_type(o.__html__())\n        return _json.JSONEncoder.default(self, o)\n\n\nclass JSONDecoder(_json.JSONDecoder):\n    \"\"\"The default JSON decoder.  This one does not change the behavior from\n    the default simplejson encoder.  Consult the :mod:`json` documentation\n    for more information.  This decoder is not only used for the load\n    functions of this module but also :attr:`~flask.Request`.\n    \"\"\"\n\n\ndef _dump_arg_defaults(kwargs):\n    \"\"\"Inject default arguments for dump functions.\"\"\"\n    if current_app:\n        kwargs.setdefault('cls', current_app.json_encoder)\n        if not current_app.config['JSON_AS_ASCII']:\n            kwargs.setdefault('ensure_ascii', False)\n        kwargs.setdefault('sort_keys', current_app.config['JSON_SORT_KEYS'])\n    else:\n        kwargs.setdefault('sort_keys', True)\n        kwargs.setdefault('cls', JSONEncoder)\n\n\ndef _load_arg_defaults(kwargs):\n    \"\"\"Inject default arguments for load functions.\"\"\"\n    if current_app:\n        kwargs.setdefault('cls', current_app.json_decoder)\n    else:\n        kwargs.setdefault('cls', JSONDecoder)\n\n\ndef dumps(obj, **kwargs):\n    \"\"\"Serialize ``obj`` to a JSON formatted ``str`` by using the application's\n    configured encoder (:attr:`~flask.Flask.json_encoder`) if there is an\n    application on the stack.\n\n    This function can return ``unicode`` strings or ascii-only bytestrings by\n    default which coerce into unicode strings automatically.  That behavior by\n    default is controlled by the ``JSON_AS_ASCII`` configuration variable\n    and can be overriden by the simplejson ``ensure_ascii`` parameter.\n    \"\"\"\n    _dump_arg_defaults(kwargs)\n    encoding = kwargs.pop('encoding', None)\n    rv = _json.dumps(obj, **kwargs)\n    if encoding is not None and isinstance(rv, text_type):\n        rv = rv.encode(encoding)\n    return rv\n\n\ndef dump(obj, fp, **kwargs):\n    \"\"\"Like :func:`dumps` but writes into a file object.\"\"\"\n    _dump_arg_defaults(kwargs)\n    encoding = kwargs.pop('encoding', None)\n    if encoding is not None:\n        fp = _wrap_writer_for_text(fp, encoding)\n    _json.dump(obj, fp, **kwargs)\n\n\ndef loads(s, **kwargs):\n    \"\"\"Unserialize a JSON object from a string ``s`` by using the application's\n    configured decoder (:attr:`~flask.Flask.json_decoder`) if there is an\n    application on the stack.\n    \"\"\"\n    _load_arg_defaults(kwargs)\n    if isinstance(s, bytes):\n        s = s.decode(kwargs.pop('encoding', None) or 'utf-8')\n    return _json.loads(s, **kwargs)\n\n\ndef load(fp, **kwargs):\n    \"\"\"Like :func:`loads` but reads from a file object.\n    \"\"\"\n    _load_arg_defaults(kwargs)\n    if not PY2:\n        fp = _wrap_reader_for_text(fp, kwargs.pop('encoding', None) or 'utf-8')\n    return _json.load(fp, **kwargs)\n\n\ndef htmlsafe_dumps(obj, **kwargs):\n    \"\"\"Works exactly like :func:`dumps` but is safe for use in ``<script>``\n    tags.  It accepts the same arguments and returns a JSON string.  Note that\n    this is available in templates through the ``|tojson`` filter which will\n    also mark the result as safe.  Due to how this function escapes certain\n    characters this is safe even if used outside of ``<script>`` tags.\n\n    .. versionchanged:: 0.10\n       This function's return value is now always safe for HTML usage, even\n       if outside of script tags or if used in XHTML.\n    \"\"\"\n    rv = dumps(obj, **kwargs) \\\n        .replace(u'<', u'\\\\u003c') \\\n        .replace(u'>', u'\\\\u003e') \\\n        .replace(u'&', u'\\\\u0026')\n    if not _slash_escape:\n        rv = rv.replace('\\\\/', '/')\n    return rv\n\n\ndef htmlsafe_dump(obj, fp, **kwargs):\n    \"\"\"Like :func:`htmlsafe_dumps` but writes into a file object.\"\"\"\n    fp.write(unicode(htmlsafe_dumps(obj, **kwargs)))\n\n\ndef jsonify(*args, **kwargs):\n    \"\"\"Creates a :class:`~flask.Response` with the JSON representation of\n    the given arguments with an `application/json` mimetype.  The arguments\n    to this function are the same as to the :class:`dict` constructor.\n\n    Example usage::\n\n        from flask import jsonify\n\n        @app.route('/_get_current_user')\n        def get_current_user():\n            return jsonify(username=g.user.username,\n                           email=g.user.email,\n                           id=g.user.id)\n\n    This will send a JSON response like this to the browser::\n\n        {\n            \"username\": \"admin\",\n            \"email\": \"admin@localhost\",\n            \"id\": 42\n        }\n\n    For security reasons only objects are supported toplevel.  For more\n    information about this, have a look at :ref:`json-security`.\n\n    This function's response will be pretty printed if it was not requested\n    with ``X-Requested-With: XMLHttpRequest`` to simplify debugging unless\n    the ``JSONIFY_PRETTYPRINT_REGULAR`` config parameter is set to false.\n\n    .. versionadded:: 0.2\n    \"\"\"\n    indent = None\n    if current_app.config['JSONIFY_PRETTYPRINT_REGULAR'] \\\n        and not request.is_xhr:\n        indent = 2\n    return current_app.response_class(dumps(dict(*args, **kwargs),\n        indent=indent),\n        mimetype='application/json')\n\n\ndef tojson_filter(obj, **kwargs):\n    return Markup(htmlsafe_dumps(obj, **kwargs))\n"
  },
  {
    "path": "lib/flask/logging.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    flask.logging\n    ~~~~~~~~~~~~~\n\n    Implements the logging support for Flask.\n\n    :copyright: (c) 2011 by Armin Ronacher.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\n\nfrom __future__ import absolute_import\n\nfrom logging import getLogger, StreamHandler, Formatter, getLoggerClass, DEBUG\n\n\ndef create_logger(app):\n    \"\"\"Creates a logger for the given application.  This logger works\n    similar to a regular Python logger but changes the effective logging\n    level based on the application's debug flag.  Furthermore this\n    function also removes all attached handlers in case there was a\n    logger with the log name before.\n    \"\"\"\n    Logger = getLoggerClass()\n\n    class DebugLogger(Logger):\n        def getEffectiveLevel(x):\n            if x.level == 0 and app.debug:\n                return DEBUG\n            return Logger.getEffectiveLevel(x)\n\n    class DebugHandler(StreamHandler):\n        def emit(x, record):\n            StreamHandler.emit(x, record) if app.debug else None\n\n    handler = DebugHandler()\n    handler.setLevel(DEBUG)\n    handler.setFormatter(Formatter(app.debug_log_format))\n    logger = getLogger(app.logger_name)\n    # just in case that was not a new logger, get rid of all the handlers\n    # already attached to it.\n    del logger.handlers[:]\n    logger.__class__ = DebugLogger\n    logger.addHandler(handler)\n    return logger\n"
  },
  {
    "path": "lib/flask/module.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    flask.module\n    ~~~~~~~~~~~~\n\n    Implements a class that represents module blueprints.\n\n    :copyright: (c) 2011 by Armin Ronacher.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\n\nimport os\n\nfrom .blueprints import Blueprint\n\n\ndef blueprint_is_module(bp):\n    \"\"\"Used to figure out if something is actually a module\"\"\"\n    return isinstance(bp, Module)\n\n\nclass Module(Blueprint):\n    \"\"\"Deprecated module support.  Until Flask 0.6 modules were a different\n    name of the concept now available as blueprints in Flask.  They are\n    essentially doing the same but have some bad semantics for templates and\n    static files that were fixed with blueprints.\n\n    .. versionchanged:: 0.7\n       Modules were deprecated in favor for blueprints.\n    \"\"\"\n\n    def __init__(self, import_name, name=None, url_prefix=None,\n                 static_path=None, subdomain=None):\n        if name is None:\n            assert '.' in import_name, 'name required if package name ' \\\n                'does not point to a submodule'\n            name = import_name.rsplit('.', 1)[1]\n        Blueprint.__init__(self, name, import_name, url_prefix=url_prefix,\n                           subdomain=subdomain, template_folder='templates')\n\n        if os.path.isdir(os.path.join(self.root_path, 'static')):\n            self._static_folder = 'static'\n"
  },
  {
    "path": "lib/flask/sessions.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    flask.sessions\n    ~~~~~~~~~~~~~~\n\n    Implements cookie based sessions based on itsdangerous.\n\n    :copyright: (c) 2012 by Armin Ronacher.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\n\nimport uuid\nimport hashlib\nfrom datetime import datetime\nfrom werkzeug.http import http_date, parse_date\nfrom werkzeug.datastructures import CallbackDict\nfrom . import Markup, json\nfrom ._compat import iteritems, text_type\n\nfrom itsdangerous import URLSafeTimedSerializer, BadSignature\n\n\ndef total_seconds(td):\n    return td.days * 60 * 60 * 24 + td.seconds\n\n\nclass SessionMixin(object):\n    \"\"\"Expands a basic dictionary with an accessors that are expected\n    by Flask extensions and users for the session.\n    \"\"\"\n\n    def _get_permanent(self):\n        return self.get('_permanent', False)\n\n    def _set_permanent(self, value):\n        self['_permanent'] = bool(value)\n\n    #: this reflects the ``'_permanent'`` key in the dict.\n    permanent = property(_get_permanent, _set_permanent)\n    del _get_permanent, _set_permanent\n\n    #: some session backends can tell you if a session is new, but that is\n    #: not necessarily guaranteed.  Use with caution.  The default mixin\n    #: implementation just hardcodes `False` in.\n    new = False\n\n    #: for some backends this will always be `True`, but some backends will\n    #: default this to false and detect changes in the dictionary for as\n    #: long as changes do not happen on mutable structures in the session.\n    #: The default mixin implementation just hardcodes `True` in.\n    modified = True\n\n\nclass TaggedJSONSerializer(object):\n    \"\"\"A customized JSON serializer that supports a few extra types that\n    we take for granted when serializing (tuples, markup objects, datetime).\n    \"\"\"\n\n    def dumps(self, value):\n        def _tag(value):\n            if isinstance(value, tuple):\n                return {' t': [_tag(x) for x in value]}\n            elif isinstance(value, uuid.UUID):\n                return {' u': value.hex}\n            elif callable(getattr(value, '__html__', None)):\n                return {' m': text_type(value.__html__())}\n            elif isinstance(value, list):\n                return [_tag(x) for x in value]\n            elif isinstance(value, datetime):\n                return {' d': http_date(value)}\n            elif isinstance(value, dict):\n                return dict((k, _tag(v)) for k, v in iteritems(value))\n            elif isinstance(value, str):\n                try:\n                    return text_type(value)\n                except UnicodeError:\n                    raise UnexpectedUnicodeError(u'A byte string with '\n                        u'non-ASCII data was passed to the session system '\n                        u'which can only store unicode strings.  Consider '\n                        u'base64 encoding your string (String was %r)' % value)\n            return value\n        return json.dumps(_tag(value), separators=(',', ':'))\n\n    def loads(self, value):\n        def object_hook(obj):\n            if len(obj) != 1:\n                return obj\n            the_key, the_value = next(iteritems(obj))\n            if the_key == ' t':\n                return tuple(the_value)\n            elif the_key == ' u':\n                return uuid.UUID(the_value)\n            elif the_key == ' m':\n                return Markup(the_value)\n            elif the_key == ' d':\n                return parse_date(the_value)\n            return obj\n        return json.loads(value, object_hook=object_hook)\n\n\nsession_json_serializer = TaggedJSONSerializer()\n\n\nclass SecureCookieSession(CallbackDict, SessionMixin):\n    \"\"\"Baseclass for sessions based on signed cookies.\"\"\"\n\n    def __init__(self, initial=None):\n        def on_update(self):\n            self.modified = True\n        CallbackDict.__init__(self, initial, on_update)\n        self.modified = False\n\n\nclass NullSession(SecureCookieSession):\n    \"\"\"Class used to generate nicer error messages if sessions are not\n    available.  Will still allow read-only access to the empty session\n    but fail on setting.\n    \"\"\"\n\n    def _fail(self, *args, **kwargs):\n        raise RuntimeError('the session is unavailable because no secret '\n                           'key was set.  Set the secret_key on the '\n                           'application to something unique and secret.')\n    __setitem__ = __delitem__ = clear = pop = popitem = \\\n        update = setdefault = _fail\n    del _fail\n\n\nclass SessionInterface(object):\n    \"\"\"The basic interface you have to implement in order to replace the\n    default session interface which uses werkzeug's securecookie\n    implementation.  The only methods you have to implement are\n    :meth:`open_session` and :meth:`save_session`, the others have\n    useful defaults which you don't need to change.\n\n    The session object returned by the :meth:`open_session` method has to\n    provide a dictionary like interface plus the properties and methods\n    from the :class:`SessionMixin`.  We recommend just subclassing a dict\n    and adding that mixin::\n\n        class Session(dict, SessionMixin):\n            pass\n\n    If :meth:`open_session` returns `None` Flask will call into\n    :meth:`make_null_session` to create a session that acts as replacement\n    if the session support cannot work because some requirement is not\n    fulfilled.  The default :class:`NullSession` class that is created\n    will complain that the secret key was not set.\n\n    To replace the session interface on an application all you have to do\n    is to assign :attr:`flask.Flask.session_interface`::\n\n        app = Flask(__name__)\n        app.session_interface = MySessionInterface()\n\n    .. versionadded:: 0.8\n    \"\"\"\n\n    #: :meth:`make_null_session` will look here for the class that should\n    #: be created when a null session is requested.  Likewise the\n    #: :meth:`is_null_session` method will perform a typecheck against\n    #: this type.\n    null_session_class = NullSession\n\n    #: A flag that indicates if the session interface is pickle based.\n    #: This can be used by flask extensions to make a decision in regards\n    #: to how to deal with the session object.\n    #:\n    #: .. versionadded:: 0.10\n    pickle_based = False\n\n    def make_null_session(self, app):\n        \"\"\"Creates a null session which acts as a replacement object if the\n        real session support could not be loaded due to a configuration\n        error.  This mainly aids the user experience because the job of the\n        null session is to still support lookup without complaining but\n        modifications are answered with a helpful error message of what\n        failed.\n\n        This creates an instance of :attr:`null_session_class` by default.\n        \"\"\"\n        return self.null_session_class()\n\n    def is_null_session(self, obj):\n        \"\"\"Checks if a given object is a null session.  Null sessions are\n        not asked to be saved.\n\n        This checks if the object is an instance of :attr:`null_session_class`\n        by default.\n        \"\"\"\n        return isinstance(obj, self.null_session_class)\n\n    def get_cookie_domain(self, app):\n        \"\"\"Helpful helper method that returns the cookie domain that should\n        be used for the session cookie if session cookies are used.\n        \"\"\"\n        if app.config['SESSION_COOKIE_DOMAIN'] is not None:\n            return app.config['SESSION_COOKIE_DOMAIN']\n        if app.config['SERVER_NAME'] is not None:\n            # chop of the port which is usually not supported by browsers\n            rv = '.' + app.config['SERVER_NAME'].rsplit(':', 1)[0]\n\n            # Google chrome does not like cookies set to .localhost, so\n            # we just go with no domain then.  Flask documents anyways that\n            # cross domain cookies need a fully qualified domain name\n            if rv == '.localhost':\n                rv = None\n\n            # If we infer the cookie domain from the server name we need\n            # to check if we are in a subpath.  In that case we can't\n            # set a cross domain cookie.\n            if rv is not None:\n                path = self.get_cookie_path(app)\n                if path != '/':\n                    rv = rv.lstrip('.')\n\n            return rv\n\n    def get_cookie_path(self, app):\n        \"\"\"Returns the path for which the cookie should be valid.  The\n        default implementation uses the value from the SESSION_COOKIE_PATH``\n        config var if it's set, and falls back to ``APPLICATION_ROOT`` or\n        uses ``/`` if it's `None`.\n        \"\"\"\n        return app.config['SESSION_COOKIE_PATH'] or \\\n               app.config['APPLICATION_ROOT'] or '/'\n\n    def get_cookie_httponly(self, app):\n        \"\"\"Returns True if the session cookie should be httponly.  This\n        currently just returns the value of the ``SESSION_COOKIE_HTTPONLY``\n        config var.\n        \"\"\"\n        return app.config['SESSION_COOKIE_HTTPONLY']\n\n    def get_cookie_secure(self, app):\n        \"\"\"Returns True if the cookie should be secure.  This currently\n        just returns the value of the ``SESSION_COOKIE_SECURE`` setting.\n        \"\"\"\n        return app.config['SESSION_COOKIE_SECURE']\n\n    def get_expiration_time(self, app, session):\n        \"\"\"A helper method that returns an expiration date for the session\n        or `None` if the session is linked to the browser session.  The\n        default implementation returns now + the permanent session\n        lifetime configured on the application.\n        \"\"\"\n        if session.permanent:\n            return datetime.utcnow() + app.permanent_session_lifetime\n\n    def open_session(self, app, request):\n        \"\"\"This method has to be implemented and must either return `None`\n        in case the loading failed because of a configuration error or an\n        instance of a session object which implements a dictionary like\n        interface + the methods and attributes on :class:`SessionMixin`.\n        \"\"\"\n        raise NotImplementedError()\n\n    def save_session(self, app, session, response):\n        \"\"\"This is called for actual sessions returned by :meth:`open_session`\n        at the end of the request.  This is still called during a request\n        context so if you absolutely need access to the request you can do\n        that.\n        \"\"\"\n        raise NotImplementedError()\n\n\nclass SecureCookieSessionInterface(SessionInterface):\n    \"\"\"The default session interface that stores sessions in signed cookies\n    through the :mod:`itsdangerous` module.\n    \"\"\"\n    #: the salt that should be applied on top of the secret key for the\n    #: signing of cookie based sessions.\n    salt = 'cookie-session'\n    #: the hash function to use for the signature.  The default is sha1\n    digest_method = staticmethod(hashlib.sha1)\n    #: the name of the itsdangerous supported key derivation.  The default\n    #: is hmac.\n    key_derivation = 'hmac'\n    #: A python serializer for the payload.  The default is a compact\n    #: JSON derived serializer with support for some extra Python types\n    #: such as datetime objects or tuples.\n    serializer = session_json_serializer\n    session_class = SecureCookieSession\n\n    def get_signing_serializer(self, app):\n        if not app.secret_key:\n            return None\n        signer_kwargs = dict(\n            key_derivation=self.key_derivation,\n            digest_method=self.digest_method\n        )\n        return URLSafeTimedSerializer(app.secret_key, salt=self.salt,\n                                      serializer=self.serializer,\n                                      signer_kwargs=signer_kwargs)\n\n    def open_session(self, app, request):\n        s = self.get_signing_serializer(app)\n        if s is None:\n            return None\n        val = request.cookies.get(app.session_cookie_name)\n        if not val:\n            return self.session_class()\n        max_age = total_seconds(app.permanent_session_lifetime)\n        try:\n            data = s.loads(val, max_age=max_age)\n            return self.session_class(data)\n        except BadSignature:\n            return self.session_class()\n\n    def save_session(self, app, session, response):\n        domain = self.get_cookie_domain(app)\n        path = self.get_cookie_path(app)\n        if not session:\n            if session.modified:\n                response.delete_cookie(app.session_cookie_name,\n                                       domain=domain, path=path)\n            return\n        httponly = self.get_cookie_httponly(app)\n        secure = self.get_cookie_secure(app)\n        expires = self.get_expiration_time(app, session)\n        val = self.get_signing_serializer(app).dumps(dict(session))\n        response.set_cookie(app.session_cookie_name, val,\n                            expires=expires, httponly=httponly,\n                            domain=domain, path=path, secure=secure)\n\n\nfrom flask.debughelpers import UnexpectedUnicodeError\n"
  },
  {
    "path": "lib/flask/signals.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    flask.signals\n    ~~~~~~~~~~~~~\n\n    Implements signals based on blinker if available, otherwise\n    falls silently back to a noop\n\n    :copyright: (c) 2011 by Armin Ronacher.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nsignals_available = False\ntry:\n    from blinker import Namespace\n    signals_available = True\nexcept ImportError:\n    class Namespace(object):\n        def signal(self, name, doc=None):\n            return _FakeSignal(name, doc)\n\n    class _FakeSignal(object):\n        \"\"\"If blinker is unavailable, create a fake class with the same\n        interface that allows sending of signals but will fail with an\n        error on anything else.  Instead of doing anything on send, it\n        will just ignore the arguments and do nothing instead.\n        \"\"\"\n\n        def __init__(self, name, doc=None):\n            self.name = name\n            self.__doc__ = doc\n        def _fail(self, *args, **kwargs):\n            raise RuntimeError('signalling support is unavailable '\n                               'because the blinker library is '\n                               'not installed.')\n        send = lambda *a, **kw: None\n        connect = disconnect = has_receivers_for = receivers_for = \\\n            temporarily_connected_to = connected_to = _fail\n        del _fail\n\n# the namespace for code signals.  If you are not flask code, do\n# not put signals in here.  Create your own namespace instead.\n_signals = Namespace()\n\n\n# core signals.  For usage examples grep the sourcecode or consult\n# the API documentation in docs/api.rst as well as docs/signals.rst\ntemplate_rendered = _signals.signal('template-rendered')\nrequest_started = _signals.signal('request-started')\nrequest_finished = _signals.signal('request-finished')\nrequest_tearing_down = _signals.signal('request-tearing-down')\ngot_request_exception = _signals.signal('got-request-exception')\nappcontext_tearing_down = _signals.signal('appcontext-tearing-down')\nappcontext_pushed = _signals.signal('appcontext-pushed')\nappcontext_popped = _signals.signal('appcontext-popped')\nmessage_flashed = _signals.signal('message-flashed')\n"
  },
  {
    "path": "lib/flask/templating.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    flask.templating\n    ~~~~~~~~~~~~~~~~\n\n    Implements the bridge to Jinja2.\n\n    :copyright: (c) 2011 by Armin Ronacher.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nimport posixpath\nfrom jinja2 import BaseLoader, Environment as BaseEnvironment, \\\n     TemplateNotFound\n\nfrom .globals import _request_ctx_stack, _app_ctx_stack\nfrom .signals import template_rendered\nfrom .module import blueprint_is_module\nfrom ._compat import itervalues, iteritems\n\n\ndef _default_template_ctx_processor():\n    \"\"\"Default template context processor.  Injects `request`,\n    `session` and `g`.\n    \"\"\"\n    reqctx = _request_ctx_stack.top\n    appctx = _app_ctx_stack.top\n    rv = {}\n    if appctx is not None:\n        rv['g'] = appctx.g\n    if reqctx is not None:\n        rv['request'] = reqctx.request\n        rv['session'] = reqctx.session\n    return rv\n\n\nclass Environment(BaseEnvironment):\n    \"\"\"Works like a regular Jinja2 environment but has some additional\n    knowledge of how Flask's blueprint works so that it can prepend the\n    name of the blueprint to referenced templates if necessary.\n    \"\"\"\n\n    def __init__(self, app, **options):\n        if 'loader' not in options:\n            options['loader'] = app.create_global_jinja_loader()\n        BaseEnvironment.__init__(self, **options)\n        self.app = app\n\n\nclass DispatchingJinjaLoader(BaseLoader):\n    \"\"\"A loader that looks for templates in the application and all\n    the blueprint folders.\n    \"\"\"\n\n    def __init__(self, app):\n        self.app = app\n\n    def get_source(self, environment, template):\n        for loader, local_name in self._iter_loaders(template):\n            try:\n                return loader.get_source(environment, local_name)\n            except TemplateNotFound:\n                pass\n\n        raise TemplateNotFound(template)\n\n    def _iter_loaders(self, template):\n        loader = self.app.jinja_loader\n        if loader is not None:\n            yield loader, template\n\n        # old style module based loaders in case we are dealing with a\n        # blueprint that is an old style module\n        try:\n            module, local_name = posixpath.normpath(template).split('/', 1)\n            blueprint = self.app.blueprints[module]\n            if blueprint_is_module(blueprint):\n                loader = blueprint.jinja_loader\n                if loader is not None:\n                    yield loader, local_name\n        except (ValueError, KeyError):\n            pass\n\n        for blueprint in itervalues(self.app.blueprints):\n            if blueprint_is_module(blueprint):\n                continue\n            loader = blueprint.jinja_loader\n            if loader is not None:\n                yield loader, template\n\n    def list_templates(self):\n        result = set()\n        loader = self.app.jinja_loader\n        if loader is not None:\n            result.update(loader.list_templates())\n\n        for name, blueprint in iteritems(self.app.blueprints):\n            loader = blueprint.jinja_loader\n            if loader is not None:\n                for template in loader.list_templates():\n                    prefix = ''\n                    if blueprint_is_module(blueprint):\n                        prefix = name + '/'\n                    result.add(prefix + template)\n\n        return list(result)\n\n\ndef _render(template, context, app):\n    \"\"\"Renders the template and fires the signal\"\"\"\n    rv = template.render(context)\n    template_rendered.send(app, template=template, context=context)\n    return rv\n\n\ndef render_template(template_name_or_list, **context):\n    \"\"\"Renders a template from the template folder with the given\n    context.\n\n    :param template_name_or_list: the name of the template to be\n                                  rendered, or an iterable with template names\n                                  the first one existing will be rendered\n    :param context: the variables that should be available in the\n                    context of the template.\n    \"\"\"\n    ctx = _app_ctx_stack.top\n    ctx.app.update_template_context(context)\n    return _render(ctx.app.jinja_env.get_or_select_template(template_name_or_list),\n                   context, ctx.app)\n\n\ndef render_template_string(source, **context):\n    \"\"\"Renders a template from the given template source string\n    with the given context.\n\n    :param source: the sourcecode of the template to be\n                   rendered\n    :param context: the variables that should be available in the\n                    context of the template.\n    \"\"\"\n    ctx = _app_ctx_stack.top\n    ctx.app.update_template_context(context)\n    return _render(ctx.app.jinja_env.from_string(source),\n                   context, ctx.app)\n"
  },
  {
    "path": "lib/flask/testing.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    flask.testing\n    ~~~~~~~~~~~~~\n\n    Implements test support helpers.  This module is lazily imported\n    and usually not used in production environments.\n\n    :copyright: (c) 2011 by Armin Ronacher.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\n\nfrom contextlib import contextmanager\nfrom werkzeug.test import Client, EnvironBuilder\nfrom flask import _request_ctx_stack\n\ntry:\n    from werkzeug.urls import url_parse\nexcept ImportError:\n    from urlparse import urlsplit as url_parse\n\n\ndef make_test_environ_builder(app, path='/', base_url=None, *args, **kwargs):\n    \"\"\"Creates a new test builder with some application defaults thrown in.\"\"\"\n    http_host = app.config.get('SERVER_NAME')\n    app_root = app.config.get('APPLICATION_ROOT')\n    if base_url is None:\n        url = url_parse(path)\n        base_url = 'http://%s/' % (url.netloc or http_host or 'localhost')\n        if app_root:\n            base_url += app_root.lstrip('/')\n        if url.netloc:\n            path = url.path\n    return EnvironBuilder(path, base_url, *args, **kwargs)\n\n\nclass FlaskClient(Client):\n    \"\"\"Works like a regular Werkzeug test client but has some knowledge about\n    how Flask works to defer the cleanup of the request context stack to the\n    end of a with body when used in a with statement.  For general information\n    about how to use this class refer to :class:`werkzeug.test.Client`.\n\n    Basic usage is outlined in the :ref:`testing` chapter.\n    \"\"\"\n\n    preserve_context = False\n\n    @contextmanager\n    def session_transaction(self, *args, **kwargs):\n        \"\"\"When used in combination with a with statement this opens a\n        session transaction.  This can be used to modify the session that\n        the test client uses.  Once the with block is left the session is\n        stored back.\n\n            with client.session_transaction() as session:\n                session['value'] = 42\n\n        Internally this is implemented by going through a temporary test\n        request context and since session handling could depend on\n        request variables this function accepts the same arguments as\n        :meth:`~flask.Flask.test_request_context` which are directly\n        passed through.\n        \"\"\"\n        if self.cookie_jar is None:\n            raise RuntimeError('Session transactions only make sense '\n                               'with cookies enabled.')\n        app = self.application\n        environ_overrides = kwargs.setdefault('environ_overrides', {})\n        self.cookie_jar.inject_wsgi(environ_overrides)\n        outer_reqctx = _request_ctx_stack.top\n        with app.test_request_context(*args, **kwargs) as c:\n            sess = app.open_session(c.request)\n            if sess is None:\n                raise RuntimeError('Session backend did not open a session. '\n                                   'Check the configuration')\n\n            # Since we have to open a new request context for the session\n            # handling we want to make sure that we hide out own context\n            # from the caller.  By pushing the original request context\n            # (or None) on top of this and popping it we get exactly that\n            # behavior.  It's important to not use the push and pop\n            # methods of the actual request context object since that would\n            # mean that cleanup handlers are called\n            _request_ctx_stack.push(outer_reqctx)\n            try:\n                yield sess\n            finally:\n                _request_ctx_stack.pop()\n\n            resp = app.response_class()\n            if not app.session_interface.is_null_session(sess):\n                app.save_session(sess, resp)\n            headers = resp.get_wsgi_headers(c.request.environ)\n            self.cookie_jar.extract_wsgi(c.request.environ, headers)\n\n    def open(self, *args, **kwargs):\n        kwargs.setdefault('environ_overrides', {}) \\\n            ['flask._preserve_context'] = self.preserve_context\n\n        as_tuple = kwargs.pop('as_tuple', False)\n        buffered = kwargs.pop('buffered', False)\n        follow_redirects = kwargs.pop('follow_redirects', False)\n        builder = make_test_environ_builder(self.application, *args, **kwargs)\n\n        return Client.open(self, builder,\n                           as_tuple=as_tuple,\n                           buffered=buffered,\n                           follow_redirects=follow_redirects)\n\n    def __enter__(self):\n        if self.preserve_context:\n            raise RuntimeError('Cannot nest client invocations')\n        self.preserve_context = True\n        return self\n\n    def __exit__(self, exc_type, exc_value, tb):\n        self.preserve_context = False\n\n        # on exit we want to clean up earlier.  Normally the request context\n        # stays preserved until the next request in the same thread comes\n        # in.  See RequestGlobals.push() for the general behavior.\n        top = _request_ctx_stack.top\n        if top is not None and top.preserved:\n            top.pop()\n"
  },
  {
    "path": "lib/flask/testsuite/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    flask.testsuite\n    ~~~~~~~~~~~~~~~\n\n    Tests Flask itself.  The majority of Flask is already tested\n    as part of Werkzeug.\n\n    :copyright: (c) 2011 by Armin Ronacher.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\n\nfrom __future__ import print_function\n\nimport os\nimport sys\nimport flask\nimport warnings\nimport unittest\nfrom functools import update_wrapper\nfrom contextlib import contextmanager\nfrom werkzeug.utils import import_string, find_modules\nfrom flask._compat import reraise, StringIO\n\n\ndef add_to_path(path):\n    \"\"\"Adds an entry to sys.path if it's not already there.  This does\n    not append it but moves it to the front so that we can be sure it\n    is loaded.\n    \"\"\"\n    if not os.path.isdir(path):\n        raise RuntimeError('Tried to add nonexisting path')\n\n    def _samefile(x, y):\n        if x == y:\n            return True\n        try:\n            return os.path.samefile(x, y)\n        except (IOError, OSError, AttributeError):\n            # Windows has no samefile\n            return False\n    sys.path[:] = [x for x in sys.path if not _samefile(path, x)]\n    sys.path.insert(0, path)\n\n\ndef iter_suites():\n    \"\"\"Yields all testsuites.\"\"\"\n    for module in find_modules(__name__):\n        mod = import_string(module)\n        if hasattr(mod, 'suite'):\n            yield mod.suite()\n\n\ndef find_all_tests(suite):\n    \"\"\"Yields all the tests and their names from a given suite.\"\"\"\n    suites = [suite]\n    while suites:\n        s = suites.pop()\n        try:\n            suites.extend(s)\n        except TypeError:\n            yield s, '%s.%s.%s' % (\n                s.__class__.__module__,\n                s.__class__.__name__,\n                s._testMethodName\n            )\n\n\n@contextmanager\ndef catch_warnings():\n    \"\"\"Catch warnings in a with block in a list\"\"\"\n    # make sure deprecation warnings are active in tests\n    warnings.simplefilter('default', category=DeprecationWarning)\n\n    filters = warnings.filters\n    warnings.filters = filters[:]\n    old_showwarning = warnings.showwarning\n    log = []\n    def showwarning(message, category, filename, lineno, file=None, line=None):\n        log.append(locals())\n    try:\n        warnings.showwarning = showwarning\n        yield log\n    finally:\n        warnings.filters = filters\n        warnings.showwarning = old_showwarning\n\n\n@contextmanager\ndef catch_stderr():\n    \"\"\"Catch stderr in a StringIO\"\"\"\n    old_stderr = sys.stderr\n    sys.stderr = rv = StringIO()\n    try:\n        yield rv\n    finally:\n        sys.stderr = old_stderr\n\n\ndef emits_module_deprecation_warning(f):\n    def new_f(self, *args, **kwargs):\n        with catch_warnings() as log:\n            f(self, *args, **kwargs)\n            self.assert_true(log, 'expected deprecation warning')\n            for entry in log:\n                self.assert_in('Modules are deprecated', str(entry['message']))\n    return update_wrapper(new_f, f)\n\n\nclass FlaskTestCase(unittest.TestCase):\n    \"\"\"Baseclass for all the tests that Flask uses.  Use these methods\n    for testing instead of the camelcased ones in the baseclass for\n    consistency.\n    \"\"\"\n\n    def ensure_clean_request_context(self):\n        # make sure we're not leaking a request context since we are\n        # testing flask internally in debug mode in a few cases\n        leaks = []\n        while flask._request_ctx_stack.top is not None:\n            leaks.append(flask._request_ctx_stack.pop())\n        self.assert_equal(leaks, [])\n\n    def setup(self):\n        pass\n\n    def teardown(self):\n        pass\n\n    def setUp(self):\n        self.setup()\n\n    def tearDown(self):\n        unittest.TestCase.tearDown(self)\n        self.ensure_clean_request_context()\n        self.teardown()\n\n    def assert_equal(self, x, y):\n        return self.assertEqual(x, y)\n\n    def assert_raises(self, exc_type, callable=None, *args, **kwargs):\n        catcher = _ExceptionCatcher(self, exc_type)\n        if callable is None:\n            return catcher\n        with catcher:\n            callable(*args, **kwargs)\n\n    def assert_true(self, x, msg=None):\n        self.assertTrue(x, msg)\n\n    def assert_false(self, x, msg=None):\n        self.assertFalse(x, msg)\n\n    def assert_in(self, x, y):\n        self.assertIn(x, y)\n\n    def assert_not_in(self, x, y):\n        self.assertNotIn(x, y)\n\n    if sys.version_info[:2] == (2, 6):\n        def assertIn(self, x, y):\n            assert x in y, \"%r unexpectedly not in %r\" % (x, y)\n\n        def assertNotIn(self, x, y):\n            assert x not in y, \"%r unexpectedly in %r\" % (x, y)\n\n\nclass _ExceptionCatcher(object):\n\n    def __init__(self, test_case, exc_type):\n        self.test_case = test_case\n        self.exc_type = exc_type\n\n    def __enter__(self):\n        return self\n\n    def __exit__(self, exc_type, exc_value, tb):\n        exception_name = self.exc_type.__name__\n        if exc_type is None:\n            self.test_case.fail('Expected exception of type %r' %\n                                exception_name)\n        elif not issubclass(exc_type, self.exc_type):\n            reraise(exc_type, exc_value, tb)\n        return True\n\n\nclass BetterLoader(unittest.TestLoader):\n    \"\"\"A nicer loader that solves two problems.  First of all we are setting\n    up tests from different sources and we're doing this programmatically\n    which breaks the default loading logic so this is required anyways.\n    Secondly this loader has a nicer interpolation for test names than the\n    default one so you can just do ``run-tests.py ViewTestCase`` and it\n    will work.\n    \"\"\"\n\n    def getRootSuite(self):\n        return suite()\n\n    def loadTestsFromName(self, name, module=None):\n        root = self.getRootSuite()\n        if name == 'suite':\n            return root\n\n        all_tests = []\n        for testcase, testname in find_all_tests(root):\n            if testname == name or \\\n               testname.endswith('.' + name) or \\\n               ('.' + name + '.') in testname or \\\n               testname.startswith(name + '.'):\n                all_tests.append(testcase)\n\n        if not all_tests:\n            raise LookupError('could not find test case for \"%s\"' % name)\n\n        if len(all_tests) == 1:\n            return all_tests[0]\n        rv = unittest.TestSuite()\n        for test in all_tests:\n            rv.addTest(test)\n        return rv\n\n\ndef setup_path():\n    add_to_path(os.path.abspath(os.path.join(\n        os.path.dirname(__file__), 'test_apps')))\n\n\ndef suite():\n    \"\"\"A testsuite that has all the Flask tests.  You can use this\n    function to integrate the Flask tests into your own testsuite\n    in case you want to test that monkeypatches to Flask do not\n    break it.\n    \"\"\"\n    setup_path()\n    suite = unittest.TestSuite()\n    for other_suite in iter_suites():\n        suite.addTest(other_suite)\n    return suite\n\n\ndef main():\n    \"\"\"Runs the testsuite as command line application.\"\"\"\n    try:\n        unittest.main(testLoader=BetterLoader(), defaultTest='suite')\n    except Exception as e:\n        print('Error: %s' % e)\n"
  },
  {
    "path": "lib/flask/testsuite/appctx.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    flask.testsuite.appctx\n    ~~~~~~~~~~~~~~~~~~~~~~\n\n    Tests the application context.\n\n    :copyright: (c) 2012 by Armin Ronacher.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\n\nimport flask\nimport unittest\nfrom flask.testsuite import FlaskTestCase\n\n\nclass AppContextTestCase(FlaskTestCase):\n\n    def test_basic_url_generation(self):\n        app = flask.Flask(__name__)\n        app.config['SERVER_NAME'] = 'localhost'\n        app.config['PREFERRED_URL_SCHEME'] = 'https'\n\n        @app.route('/')\n        def index():\n            pass\n\n        with app.app_context():\n            rv = flask.url_for('index')\n            self.assert_equal(rv, 'https://localhost/')\n\n    def test_url_generation_requires_server_name(self):\n        app = flask.Flask(__name__)\n        with app.app_context():\n            with self.assert_raises(RuntimeError):\n                flask.url_for('index')\n\n    def test_url_generation_without_context_fails(self):\n        with self.assert_raises(RuntimeError):\n            flask.url_for('index')\n\n    def test_request_context_means_app_context(self):\n        app = flask.Flask(__name__)\n        with app.test_request_context():\n            self.assert_equal(flask.current_app._get_current_object(), app)\n        self.assert_equal(flask._app_ctx_stack.top, None)\n\n    def test_app_context_provides_current_app(self):\n        app = flask.Flask(__name__)\n        with app.app_context():\n            self.assert_equal(flask.current_app._get_current_object(), app)\n        self.assert_equal(flask._app_ctx_stack.top, None)\n\n    def test_app_tearing_down(self):\n        cleanup_stuff = []\n        app = flask.Flask(__name__)\n        @app.teardown_appcontext\n        def cleanup(exception):\n            cleanup_stuff.append(exception)\n\n        with app.app_context():\n            pass\n\n        self.assert_equal(cleanup_stuff, [None])\n\n    def test_custom_app_ctx_globals_class(self):\n        class CustomRequestGlobals(object):\n            def __init__(self):\n                self.spam = 'eggs'\n        app = flask.Flask(__name__)\n        app.app_ctx_globals_class = CustomRequestGlobals\n        with app.app_context():\n            self.assert_equal(\n                flask.render_template_string('{{ g.spam }}'), 'eggs')\n\n    def test_context_refcounts(self):\n        called = []\n        app = flask.Flask(__name__)\n        @app.teardown_request\n        def teardown_req(error=None):\n            called.append('request')\n        @app.teardown_appcontext\n        def teardown_app(error=None):\n            called.append('app')\n        @app.route('/')\n        def index():\n            with flask._app_ctx_stack.top:\n                with flask._request_ctx_stack.top:\n                    pass\n            self.assert_true(flask._request_ctx_stack.top.request.environ\n                ['werkzeug.request'] is not None)\n            return u''\n        c = app.test_client()\n        c.get('/')\n        self.assertEqual(called, ['request', 'app'])\n\n\ndef suite():\n    suite = unittest.TestSuite()\n    suite.addTest(unittest.makeSuite(AppContextTestCase))\n    return suite\n"
  },
  {
    "path": "lib/flask/testsuite/basic.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    flask.testsuite.basic\n    ~~~~~~~~~~~~~~~~~~~~~\n\n    The basic functionality.\n\n    :copyright: (c) 2011 by Armin Ronacher.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\n\nimport re\nimport uuid\nimport flask\nimport pickle\nimport unittest\nfrom datetime import datetime\nfrom threading import Thread\nfrom flask.testsuite import FlaskTestCase, emits_module_deprecation_warning\nfrom flask._compat import text_type\nfrom werkzeug.exceptions import BadRequest, NotFound\nfrom werkzeug.http import parse_date\nfrom werkzeug.routing import BuildError\n\n\nclass BasicFunctionalityTestCase(FlaskTestCase):\n\n    def test_options_work(self):\n        app = flask.Flask(__name__)\n        @app.route('/', methods=['GET', 'POST'])\n        def index():\n            return 'Hello World'\n        rv = app.test_client().open('/', method='OPTIONS')\n        self.assert_equal(sorted(rv.allow), ['GET', 'HEAD', 'OPTIONS', 'POST'])\n        self.assert_equal(rv.data, b'')\n\n    def test_options_on_multiple_rules(self):\n        app = flask.Flask(__name__)\n        @app.route('/', methods=['GET', 'POST'])\n        def index():\n            return 'Hello World'\n        @app.route('/', methods=['PUT'])\n        def index_put():\n            return 'Aha!'\n        rv = app.test_client().open('/', method='OPTIONS')\n        self.assert_equal(sorted(rv.allow), ['GET', 'HEAD', 'OPTIONS', 'POST', 'PUT'])\n\n    def test_options_handling_disabled(self):\n        app = flask.Flask(__name__)\n        def index():\n            return 'Hello World!'\n        index.provide_automatic_options = False\n        app.route('/')(index)\n        rv = app.test_client().open('/', method='OPTIONS')\n        self.assert_equal(rv.status_code, 405)\n\n        app = flask.Flask(__name__)\n        def index2():\n            return 'Hello World!'\n        index2.provide_automatic_options = True\n        app.route('/', methods=['OPTIONS'])(index2)\n        rv = app.test_client().open('/', method='OPTIONS')\n        self.assert_equal(sorted(rv.allow), ['OPTIONS'])\n\n    def test_request_dispatching(self):\n        app = flask.Flask(__name__)\n        @app.route('/')\n        def index():\n            return flask.request.method\n        @app.route('/more', methods=['GET', 'POST'])\n        def more():\n            return flask.request.method\n\n        c = app.test_client()\n        self.assert_equal(c.get('/').data, b'GET')\n        rv = c.post('/')\n        self.assert_equal(rv.status_code, 405)\n        self.assert_equal(sorted(rv.allow), ['GET', 'HEAD', 'OPTIONS'])\n        rv = c.head('/')\n        self.assert_equal(rv.status_code, 200)\n        self.assert_false(rv.data) # head truncates\n        self.assert_equal(c.post('/more').data, b'POST')\n        self.assert_equal(c.get('/more').data, b'GET')\n        rv = c.delete('/more')\n        self.assert_equal(rv.status_code, 405)\n        self.assert_equal(sorted(rv.allow), ['GET', 'HEAD', 'OPTIONS', 'POST'])\n\n    def test_url_mapping(self):\n        app = flask.Flask(__name__)\n        def index():\n            return flask.request.method\n        def more():\n            return flask.request.method\n\n        app.add_url_rule('/', 'index', index)\n        app.add_url_rule('/more', 'more', more, methods=['GET', 'POST'])\n\n        c = app.test_client()\n        self.assert_equal(c.get('/').data, b'GET')\n        rv = c.post('/')\n        self.assert_equal(rv.status_code, 405)\n        self.assert_equal(sorted(rv.allow), ['GET', 'HEAD', 'OPTIONS'])\n        rv = c.head('/')\n        self.assert_equal(rv.status_code, 200)\n        self.assert_false(rv.data) # head truncates\n        self.assert_equal(c.post('/more').data, b'POST')\n        self.assert_equal(c.get('/more').data, b'GET')\n        rv = c.delete('/more')\n        self.assert_equal(rv.status_code, 405)\n        self.assert_equal(sorted(rv.allow), ['GET', 'HEAD', 'OPTIONS', 'POST'])\n\n    def test_werkzeug_routing(self):\n        from werkzeug.routing import Submount, Rule\n        app = flask.Flask(__name__)\n        app.url_map.add(Submount('/foo', [\n            Rule('/bar', endpoint='bar'),\n            Rule('/', endpoint='index')\n        ]))\n        def bar():\n            return 'bar'\n        def index():\n            return 'index'\n        app.view_functions['bar'] = bar\n        app.view_functions['index'] = index\n\n        c = app.test_client()\n        self.assert_equal(c.get('/foo/').data, b'index')\n        self.assert_equal(c.get('/foo/bar').data, b'bar')\n\n    def test_endpoint_decorator(self):\n        from werkzeug.routing import Submount, Rule\n        app = flask.Flask(__name__)\n        app.url_map.add(Submount('/foo', [\n            Rule('/bar', endpoint='bar'),\n            Rule('/', endpoint='index')\n        ]))\n\n        @app.endpoint('bar')\n        def bar():\n            return 'bar'\n\n        @app.endpoint('index')\n        def index():\n            return 'index'\n\n        c = app.test_client()\n        self.assert_equal(c.get('/foo/').data, b'index')\n        self.assert_equal(c.get('/foo/bar').data, b'bar')\n\n    def test_session(self):\n        app = flask.Flask(__name__)\n        app.secret_key = 'testkey'\n        @app.route('/set', methods=['POST'])\n        def set():\n            flask.session['value'] = flask.request.form['value']\n            return 'value set'\n        @app.route('/get')\n        def get():\n            return flask.session['value']\n\n        c = app.test_client()\n        self.assert_equal(c.post('/set', data={'value': '42'}).data, b'value set')\n        self.assert_equal(c.get('/get').data, b'42')\n\n    def test_session_using_server_name(self):\n        app = flask.Flask(__name__)\n        app.config.update(\n            SECRET_KEY='foo',\n            SERVER_NAME='example.com'\n        )\n        @app.route('/')\n        def index():\n            flask.session['testing'] = 42\n            return 'Hello World'\n        rv = app.test_client().get('/', 'http://example.com/')\n        self.assert_in('domain=.example.com', rv.headers['set-cookie'].lower())\n        self.assert_in('httponly', rv.headers['set-cookie'].lower())\n\n    def test_session_using_server_name_and_port(self):\n        app = flask.Flask(__name__)\n        app.config.update(\n            SECRET_KEY='foo',\n            SERVER_NAME='example.com:8080'\n        )\n        @app.route('/')\n        def index():\n            flask.session['testing'] = 42\n            return 'Hello World'\n        rv = app.test_client().get('/', 'http://example.com:8080/')\n        self.assert_in('domain=.example.com', rv.headers['set-cookie'].lower())\n        self.assert_in('httponly', rv.headers['set-cookie'].lower())\n\n    def test_session_using_server_name_port_and_path(self):\n        app = flask.Flask(__name__)\n        app.config.update(\n            SECRET_KEY='foo',\n            SERVER_NAME='example.com:8080',\n            APPLICATION_ROOT='/foo'\n        )\n        @app.route('/')\n        def index():\n            flask.session['testing'] = 42\n            return 'Hello World'\n        rv = app.test_client().get('/', 'http://example.com:8080/foo')\n        self.assert_in('domain=example.com', rv.headers['set-cookie'].lower())\n        self.assert_in('path=/foo', rv.headers['set-cookie'].lower())\n        self.assert_in('httponly', rv.headers['set-cookie'].lower())\n\n    def test_session_using_application_root(self):\n        class PrefixPathMiddleware(object):\n            def __init__(self, app, prefix):\n                self.app = app\n                self.prefix = prefix\n            def __call__(self, environ, start_response):\n                environ['SCRIPT_NAME'] = self.prefix\n                return self.app(environ, start_response)\n\n        app = flask.Flask(__name__)\n        app.wsgi_app = PrefixPathMiddleware(app.wsgi_app, '/bar')\n        app.config.update(\n            SECRET_KEY='foo',\n            APPLICATION_ROOT='/bar'\n        )\n        @app.route('/')\n        def index():\n            flask.session['testing'] = 42\n            return 'Hello World'\n        rv = app.test_client().get('/', 'http://example.com:8080/')\n        self.assert_in('path=/bar', rv.headers['set-cookie'].lower())\n\n    def test_session_using_session_settings(self):\n        app = flask.Flask(__name__)\n        app.config.update(\n            SECRET_KEY='foo',\n            SERVER_NAME='www.example.com:8080',\n            APPLICATION_ROOT='/test',\n            SESSION_COOKIE_DOMAIN='.example.com',\n            SESSION_COOKIE_HTTPONLY=False,\n            SESSION_COOKIE_SECURE=True,\n            SESSION_COOKIE_PATH='/'\n        )\n        @app.route('/')\n        def index():\n            flask.session['testing'] = 42\n            return 'Hello World'\n        rv = app.test_client().get('/', 'http://www.example.com:8080/test/')\n        cookie = rv.headers['set-cookie'].lower()\n        self.assert_in('domain=.example.com', cookie)\n        self.assert_in('path=/', cookie)\n        self.assert_in('secure', cookie)\n        self.assert_not_in('httponly', cookie)\n\n    def test_missing_session(self):\n        app = flask.Flask(__name__)\n        def expect_exception(f, *args, **kwargs):\n            try:\n                f(*args, **kwargs)\n            except RuntimeError as e:\n                self.assert_true(e.args and 'session is unavailable' in e.args[0])\n            else:\n                self.assert_true(False, 'expected exception')\n        with app.test_request_context():\n            self.assert_true(flask.session.get('missing_key') is None)\n            expect_exception(flask.session.__setitem__, 'foo', 42)\n            expect_exception(flask.session.pop, 'foo')\n\n    def test_session_expiration(self):\n        permanent = True\n        app = flask.Flask(__name__)\n        app.secret_key = 'testkey'\n        @app.route('/')\n        def index():\n            flask.session['test'] = 42\n            flask.session.permanent = permanent\n            return ''\n\n        @app.route('/test')\n        def test():\n            return text_type(flask.session.permanent)\n\n        client = app.test_client()\n        rv = client.get('/')\n        self.assert_in('set-cookie', rv.headers)\n        match = re.search(r'\\bexpires=([^;]+)(?i)', rv.headers['set-cookie'])\n        expires = parse_date(match.group())\n        expected = datetime.utcnow() + app.permanent_session_lifetime\n        self.assert_equal(expires.year, expected.year)\n        self.assert_equal(expires.month, expected.month)\n        self.assert_equal(expires.day, expected.day)\n\n        rv = client.get('/test')\n        self.assert_equal(rv.data, b'True')\n\n        permanent = False\n        rv = app.test_client().get('/')\n        self.assert_in('set-cookie', rv.headers)\n        match = re.search(r'\\bexpires=([^;]+)', rv.headers['set-cookie'])\n        self.assert_true(match is None)\n\n    def test_session_stored_last(self):\n        app = flask.Flask(__name__)\n        app.secret_key = 'development-key'\n        app.testing = True\n\n        @app.after_request\n        def modify_session(response):\n            flask.session['foo'] = 42\n            return response\n        @app.route('/')\n        def dump_session_contents():\n            return repr(flask.session.get('foo'))\n\n        c = app.test_client()\n        self.assert_equal(c.get('/').data, b'None')\n        self.assert_equal(c.get('/').data, b'42')\n\n    def test_session_special_types(self):\n        app = flask.Flask(__name__)\n        app.secret_key = 'development-key'\n        app.testing = True\n        now = datetime.utcnow().replace(microsecond=0)\n        the_uuid = uuid.uuid4()\n\n        @app.after_request\n        def modify_session(response):\n            flask.session['m'] = flask.Markup('Hello!')\n            flask.session['u'] = the_uuid\n            flask.session['dt'] = now\n            flask.session['t'] = (1, 2, 3)\n            return response\n\n        @app.route('/')\n        def dump_session_contents():\n            return pickle.dumps(dict(flask.session))\n\n        c = app.test_client()\n        c.get('/')\n        rv = pickle.loads(c.get('/').data)\n        self.assert_equal(rv['m'], flask.Markup('Hello!'))\n        self.assert_equal(type(rv['m']), flask.Markup)\n        self.assert_equal(rv['dt'], now)\n        self.assert_equal(rv['u'], the_uuid)\n        self.assert_equal(rv['t'], (1, 2, 3))\n\n    def test_flashes(self):\n        app = flask.Flask(__name__)\n        app.secret_key = 'testkey'\n\n        with app.test_request_context():\n            self.assert_false(flask.session.modified)\n            flask.flash('Zap')\n            flask.session.modified = False\n            flask.flash('Zip')\n            self.assert_true(flask.session.modified)\n            self.assert_equal(list(flask.get_flashed_messages()), ['Zap', 'Zip'])\n\n    def test_extended_flashing(self):\n        # Be sure app.testing=True below, else tests can fail silently.\n        #\n        # Specifically, if app.testing is not set to True, the AssertionErrors\n        # in the view functions will cause a 500 response to the test client\n        # instead of propagating exceptions.\n\n        app = flask.Flask(__name__)\n        app.secret_key = 'testkey'\n        app.testing = True\n\n        @app.route('/')\n        def index():\n            flask.flash(u'Hello World')\n            flask.flash(u'Hello World', 'error')\n            flask.flash(flask.Markup(u'<em>Testing</em>'), 'warning')\n            return ''\n\n        @app.route('/test/')\n        def test():\n            messages = flask.get_flashed_messages()\n            self.assert_equal(len(messages), 3)\n            self.assert_equal(messages[0], u'Hello World')\n            self.assert_equal(messages[1], u'Hello World')\n            self.assert_equal(messages[2], flask.Markup(u'<em>Testing</em>'))\n            return ''\n\n        @app.route('/test_with_categories/')\n        def test_with_categories():\n            messages = flask.get_flashed_messages(with_categories=True)\n            self.assert_equal(len(messages), 3)\n            self.assert_equal(messages[0], ('message', u'Hello World'))\n            self.assert_equal(messages[1], ('error', u'Hello World'))\n            self.assert_equal(messages[2], ('warning', flask.Markup(u'<em>Testing</em>')))\n            return ''\n\n        @app.route('/test_filter/')\n        def test_filter():\n            messages = flask.get_flashed_messages(category_filter=['message'], with_categories=True)\n            self.assert_equal(len(messages), 1)\n            self.assert_equal(messages[0], ('message', u'Hello World'))\n            return ''\n\n        @app.route('/test_filters/')\n        def test_filters():\n            messages = flask.get_flashed_messages(category_filter=['message', 'warning'], with_categories=True)\n            self.assert_equal(len(messages), 2)\n            self.assert_equal(messages[0], ('message', u'Hello World'))\n            self.assert_equal(messages[1], ('warning', flask.Markup(u'<em>Testing</em>')))\n            return ''\n\n        @app.route('/test_filters_without_returning_categories/')\n        def test_filters2():\n            messages = flask.get_flashed_messages(category_filter=['message', 'warning'])\n            self.assert_equal(len(messages), 2)\n            self.assert_equal(messages[0], u'Hello World')\n            self.assert_equal(messages[1], flask.Markup(u'<em>Testing</em>'))\n            return ''\n\n        # Create new test client on each test to clean flashed messages.\n\n        c = app.test_client()\n        c.get('/')\n        c.get('/test/')\n\n        c = app.test_client()\n        c.get('/')\n        c.get('/test_with_categories/')\n\n        c = app.test_client()\n        c.get('/')\n        c.get('/test_filter/')\n\n        c = app.test_client()\n        c.get('/')\n        c.get('/test_filters/')\n\n        c = app.test_client()\n        c.get('/')\n        c.get('/test_filters_without_returning_categories/')\n\n    def test_request_processing(self):\n        app = flask.Flask(__name__)\n        evts = []\n        @app.before_request\n        def before_request():\n            evts.append('before')\n        @app.after_request\n        def after_request(response):\n            response.data += b'|after'\n            evts.append('after')\n            return response\n        @app.route('/')\n        def index():\n            self.assert_in('before', evts)\n            self.assert_not_in('after', evts)\n            return 'request'\n        self.assert_not_in('after', evts)\n        rv = app.test_client().get('/').data\n        self.assert_in('after', evts)\n        self.assert_equal(rv, b'request|after')\n\n    def test_after_request_processing(self):\n        app = flask.Flask(__name__)\n        app.testing = True\n        @app.route('/')\n        def index():\n            @flask.after_this_request\n            def foo(response):\n                response.headers['X-Foo'] = 'a header'\n                return response\n            return 'Test'\n        c = app.test_client()\n        resp = c.get('/')\n        self.assertEqual(resp.status_code, 200)\n        self.assertEqual(resp.headers['X-Foo'], 'a header')\n\n    def test_teardown_request_handler(self):\n        called = []\n        app = flask.Flask(__name__)\n        @app.teardown_request\n        def teardown_request(exc):\n            called.append(True)\n            return \"Ignored\"\n        @app.route('/')\n        def root():\n            return \"Response\"\n        rv = app.test_client().get('/')\n        self.assert_equal(rv.status_code, 200)\n        self.assert_in(b'Response', rv.data)\n        self.assert_equal(len(called), 1)\n\n    def test_teardown_request_handler_debug_mode(self):\n        called = []\n        app = flask.Flask(__name__)\n        app.testing = True\n        @app.teardown_request\n        def teardown_request(exc):\n            called.append(True)\n            return \"Ignored\"\n        @app.route('/')\n        def root():\n            return \"Response\"\n        rv = app.test_client().get('/')\n        self.assert_equal(rv.status_code, 200)\n        self.assert_in(b'Response', rv.data)\n        self.assert_equal(len(called), 1)\n\n    def test_teardown_request_handler_error(self):\n        called = []\n        app = flask.Flask(__name__)\n        @app.teardown_request\n        def teardown_request1(exc):\n            self.assert_equal(type(exc), ZeroDivisionError)\n            called.append(True)\n            # This raises a new error and blows away sys.exc_info(), so we can\n            # test that all teardown_requests get passed the same original\n            # exception.\n            try:\n                raise TypeError()\n            except:\n                pass\n        @app.teardown_request\n        def teardown_request2(exc):\n            self.assert_equal(type(exc), ZeroDivisionError)\n            called.append(True)\n            # This raises a new error and blows away sys.exc_info(), so we can\n            # test that all teardown_requests get passed the same original\n            # exception.\n            try:\n                raise TypeError()\n            except:\n                pass\n        @app.route('/')\n        def fails():\n            1 // 0\n        rv = app.test_client().get('/')\n        self.assert_equal(rv.status_code, 500)\n        self.assert_in(b'Internal Server Error', rv.data)\n        self.assert_equal(len(called), 2)\n\n    def test_before_after_request_order(self):\n        called = []\n        app = flask.Flask(__name__)\n        @app.before_request\n        def before1():\n            called.append(1)\n        @app.before_request\n        def before2():\n            called.append(2)\n        @app.after_request\n        def after1(response):\n            called.append(4)\n            return response\n        @app.after_request\n        def after2(response):\n            called.append(3)\n            return response\n        @app.teardown_request\n        def finish1(exc):\n            called.append(6)\n        @app.teardown_request\n        def finish2(exc):\n            called.append(5)\n        @app.route('/')\n        def index():\n            return '42'\n        rv = app.test_client().get('/')\n        self.assert_equal(rv.data, b'42')\n        self.assert_equal(called, [1, 2, 3, 4, 5, 6])\n\n    def test_error_handling(self):\n        app = flask.Flask(__name__)\n        @app.errorhandler(404)\n        def not_found(e):\n            return 'not found', 404\n        @app.errorhandler(500)\n        def internal_server_error(e):\n            return 'internal server error', 500\n        @app.route('/')\n        def index():\n            flask.abort(404)\n        @app.route('/error')\n        def error():\n            1 // 0\n        c = app.test_client()\n        rv = c.get('/')\n        self.assert_equal(rv.status_code, 404)\n        self.assert_equal(rv.data, b'not found')\n        rv = c.get('/error')\n        self.assert_equal(rv.status_code, 500)\n        self.assert_equal(b'internal server error', rv.data)\n\n    def test_before_request_and_routing_errors(self):\n        app = flask.Flask(__name__)\n        @app.before_request\n        def attach_something():\n            flask.g.something = 'value'\n        @app.errorhandler(404)\n        def return_something(error):\n            return flask.g.something, 404\n        rv = app.test_client().get('/')\n        self.assert_equal(rv.status_code, 404)\n        self.assert_equal(rv.data, b'value')\n\n    def test_user_error_handling(self):\n        class MyException(Exception):\n            pass\n\n        app = flask.Flask(__name__)\n        @app.errorhandler(MyException)\n        def handle_my_exception(e):\n            self.assert_true(isinstance(e, MyException))\n            return '42'\n        @app.route('/')\n        def index():\n            raise MyException()\n\n        c = app.test_client()\n        self.assert_equal(c.get('/').data, b'42')\n\n    def test_trapping_of_bad_request_key_errors(self):\n        app = flask.Flask(__name__)\n        app.testing = True\n        @app.route('/fail')\n        def fail():\n            flask.request.form['missing_key']\n        c = app.test_client()\n        self.assert_equal(c.get('/fail').status_code, 400)\n\n        app.config['TRAP_BAD_REQUEST_ERRORS'] = True\n        c = app.test_client()\n        try:\n            c.get('/fail')\n        except KeyError as e:\n            self.assert_true(isinstance(e, BadRequest))\n        else:\n            self.fail('Expected exception')\n\n    def test_trapping_of_all_http_exceptions(self):\n        app = flask.Flask(__name__)\n        app.testing = True\n        app.config['TRAP_HTTP_EXCEPTIONS'] = True\n        @app.route('/fail')\n        def fail():\n            flask.abort(404)\n\n        c = app.test_client()\n        try:\n            c.get('/fail')\n        except NotFound as e:\n            pass\n        else:\n            self.fail('Expected exception')\n\n    def test_enctype_debug_helper(self):\n        from flask.debughelpers import DebugFilesKeyError\n        app = flask.Flask(__name__)\n        app.debug = True\n        @app.route('/fail', methods=['POST'])\n        def index():\n            return flask.request.files['foo'].filename\n\n        # with statement is important because we leave an exception on the\n        # stack otherwise and we want to ensure that this is not the case\n        # to not negatively affect other tests.\n        with app.test_client() as c:\n            try:\n                c.post('/fail', data={'foo': 'index.txt'})\n            except DebugFilesKeyError as e:\n                self.assert_in('no file contents were transmitted', str(e))\n                self.assert_in('This was submitted: \"index.txt\"', str(e))\n            else:\n                self.fail('Expected exception')\n\n    def test_response_creation(self):\n        app = flask.Flask(__name__)\n        @app.route('/unicode')\n        def from_unicode():\n            return u'Hällo Wörld'\n        @app.route('/string')\n        def from_string():\n            return u'Hällo Wörld'.encode('utf-8')\n        @app.route('/args')\n        def from_tuple():\n            return 'Meh', 400, {\n                'X-Foo': 'Testing',\n                'Content-Type': 'text/plain; charset=utf-8'\n            }\n        c = app.test_client()\n        self.assert_equal(c.get('/unicode').data, u'Hällo Wörld'.encode('utf-8'))\n        self.assert_equal(c.get('/string').data, u'Hällo Wörld'.encode('utf-8'))\n        rv = c.get('/args')\n        self.assert_equal(rv.data, b'Meh')\n        self.assert_equal(rv.headers['X-Foo'], 'Testing')\n        self.assert_equal(rv.status_code, 400)\n        self.assert_equal(rv.mimetype, 'text/plain')\n\n    def test_make_response(self):\n        app = flask.Flask(__name__)\n        with app.test_request_context():\n            rv = flask.make_response()\n            self.assert_equal(rv.status_code, 200)\n            self.assert_equal(rv.data, b'')\n            self.assert_equal(rv.mimetype, 'text/html')\n\n            rv = flask.make_response('Awesome')\n            self.assert_equal(rv.status_code, 200)\n            self.assert_equal(rv.data, b'Awesome')\n            self.assert_equal(rv.mimetype, 'text/html')\n\n            rv = flask.make_response('W00t', 404)\n            self.assert_equal(rv.status_code, 404)\n            self.assert_equal(rv.data, b'W00t')\n            self.assert_equal(rv.mimetype, 'text/html')\n\n    def test_make_response_with_response_instance(self):\n        app = flask.Flask(__name__)\n        with app.test_request_context():\n            rv = flask.make_response(\n                flask.jsonify({'msg': 'W00t'}), 400)\n            self.assertEqual(rv.status_code, 400)\n            self.assertEqual(rv.data, b'{\\n  \"msg\": \"W00t\"\\n}')\n            self.assertEqual(rv.mimetype, 'application/json')\n\n            rv = flask.make_response(\n                flask.Response(''), 400)\n            self.assertEqual(rv.status_code, 400)\n            self.assertEqual(rv.data, b'')\n            self.assertEqual(rv.mimetype, 'text/html')\n\n            rv = flask.make_response(\n                flask.Response('', headers={'Content-Type': 'text/html'}),\n                400, [('X-Foo', 'bar')])\n            self.assertEqual(rv.status_code, 400)\n            self.assertEqual(rv.headers['Content-Type'], 'text/html')\n            self.assertEqual(rv.headers['X-Foo'], 'bar')\n\n    def test_url_generation(self):\n        app = flask.Flask(__name__)\n        @app.route('/hello/<name>', methods=['POST'])\n        def hello():\n            pass\n        with app.test_request_context():\n            self.assert_equal(flask.url_for('hello', name='test x'), '/hello/test%20x')\n            self.assert_equal(flask.url_for('hello', name='test x', _external=True),\n                              'http://localhost/hello/test%20x')\n\n    def test_build_error_handler(self):\n        app = flask.Flask(__name__)\n\n        # Test base case, a URL which results in a BuildError.\n        with app.test_request_context():\n            self.assertRaises(BuildError, flask.url_for, 'spam')\n\n        # Verify the error is re-raised if not the current exception.\n        try:\n            with app.test_request_context():\n                flask.url_for('spam')\n        except BuildError as err:\n            error = err\n        try:\n            raise RuntimeError('Test case where BuildError is not current.')\n        except RuntimeError:\n            self.assertRaises(BuildError, app.handle_url_build_error, error, 'spam', {})\n\n        # Test a custom handler.\n        def handler(error, endpoint, values):\n            # Just a test.\n            return '/test_handler/'\n        app.url_build_error_handlers.append(handler)\n        with app.test_request_context():\n            self.assert_equal(flask.url_for('spam'), '/test_handler/')\n\n    def test_custom_converters(self):\n        from werkzeug.routing import BaseConverter\n        class ListConverter(BaseConverter):\n            def to_python(self, value):\n                return value.split(',')\n            def to_url(self, value):\n                base_to_url = super(ListConverter, self).to_url\n                return ','.join(base_to_url(x) for x in value)\n        app = flask.Flask(__name__)\n        app.url_map.converters['list'] = ListConverter\n        @app.route('/<list:args>')\n        def index(args):\n            return '|'.join(args)\n        c = app.test_client()\n        self.assert_equal(c.get('/1,2,3').data, b'1|2|3')\n\n    def test_static_files(self):\n        app = flask.Flask(__name__)\n        app.testing = True\n        rv = app.test_client().get('/static/index.html')\n        self.assert_equal(rv.status_code, 200)\n        self.assert_equal(rv.data.strip(), b'<h1>Hello World!</h1>')\n        with app.test_request_context():\n            self.assert_equal(flask.url_for('static', filename='index.html'),\n                              '/static/index.html')\n        rv.close()\n\n    def test_none_response(self):\n        app = flask.Flask(__name__)\n        @app.route('/')\n        def test():\n            return None\n        try:\n            app.test_client().get('/')\n        except ValueError as e:\n            self.assert_equal(str(e), 'View function did not return a response')\n            pass\n        else:\n            self.assert_true(\"Expected ValueError\")\n\n    def test_request_locals(self):\n        self.assert_equal(repr(flask.g), '<LocalProxy unbound>')\n        self.assertFalse(flask.g)\n\n    def test_test_app_proper_environ(self):\n        app = flask.Flask(__name__)\n        app.config.update(\n            SERVER_NAME='localhost.localdomain:5000'\n        )\n        @app.route('/')\n        def index():\n            return 'Foo'\n\n        @app.route('/', subdomain='foo')\n        def subdomain():\n            return 'Foo SubDomain'\n\n        rv = app.test_client().get('/')\n        self.assert_equal(rv.data, b'Foo')\n\n        rv = app.test_client().get('/', 'http://localhost.localdomain:5000')\n        self.assert_equal(rv.data, b'Foo')\n\n        rv = app.test_client().get('/', 'https://localhost.localdomain:5000')\n        self.assert_equal(rv.data, b'Foo')\n\n        app.config.update(SERVER_NAME='localhost.localdomain')\n        rv = app.test_client().get('/', 'https://localhost.localdomain')\n        self.assert_equal(rv.data, b'Foo')\n\n        try:\n            app.config.update(SERVER_NAME='localhost.localdomain:443')\n            rv = app.test_client().get('/', 'https://localhost.localdomain')\n            # Werkzeug 0.8\n            self.assert_equal(rv.status_code, 404)\n        except ValueError as e:\n            # Werkzeug 0.7\n            self.assert_equal(str(e), \"the server name provided \" +\n                    \"('localhost.localdomain:443') does not match the \" + \\\n                    \"server name from the WSGI environment ('localhost.localdomain')\")\n\n        try:\n            app.config.update(SERVER_NAME='localhost.localdomain')\n            rv = app.test_client().get('/', 'http://foo.localhost')\n            # Werkzeug 0.8\n            self.assert_equal(rv.status_code, 404)\n        except ValueError as e:\n            # Werkzeug 0.7\n            self.assert_equal(str(e), \"the server name provided \" + \\\n                    \"('localhost.localdomain') does not match the \" + \\\n                    \"server name from the WSGI environment ('foo.localhost')\")\n\n        rv = app.test_client().get('/', 'http://foo.localhost.localdomain')\n        self.assert_equal(rv.data, b'Foo SubDomain')\n\n    def test_exception_propagation(self):\n        def apprunner(configkey):\n            app = flask.Flask(__name__)\n            @app.route('/')\n            def index():\n                1 // 0\n            c = app.test_client()\n            if config_key is not None:\n                app.config[config_key] = True\n                try:\n                    resp = c.get('/')\n                except Exception:\n                    pass\n                else:\n                    self.fail('expected exception')\n            else:\n                self.assert_equal(c.get('/').status_code, 500)\n\n        # we have to run this test in an isolated thread because if the\n        # debug flag is set to true and an exception happens the context is\n        # not torn down.  This causes other tests that run after this fail\n        # when they expect no exception on the stack.\n        for config_key in 'TESTING', 'PROPAGATE_EXCEPTIONS', 'DEBUG', None:\n            t = Thread(target=apprunner, args=(config_key,))\n            t.start()\n            t.join()\n\n    def test_max_content_length(self):\n        app = flask.Flask(__name__)\n        app.config['MAX_CONTENT_LENGTH'] = 64\n        @app.before_request\n        def always_first():\n            flask.request.form['myfile']\n            self.assert_true(False)\n        @app.route('/accept', methods=['POST'])\n        def accept_file():\n            flask.request.form['myfile']\n            self.assert_true(False)\n        @app.errorhandler(413)\n        def catcher(error):\n            return '42'\n\n        c = app.test_client()\n        rv = c.post('/accept', data={'myfile': 'foo' * 100})\n        self.assert_equal(rv.data, b'42')\n\n    def test_url_processors(self):\n        app = flask.Flask(__name__)\n\n        @app.url_defaults\n        def add_language_code(endpoint, values):\n            if flask.g.lang_code is not None and \\\n               app.url_map.is_endpoint_expecting(endpoint, 'lang_code'):\n                values.setdefault('lang_code', flask.g.lang_code)\n\n        @app.url_value_preprocessor\n        def pull_lang_code(endpoint, values):\n            flask.g.lang_code = values.pop('lang_code', None)\n\n        @app.route('/<lang_code>/')\n        def index():\n            return flask.url_for('about')\n\n        @app.route('/<lang_code>/about')\n        def about():\n            return flask.url_for('something_else')\n\n        @app.route('/foo')\n        def something_else():\n            return flask.url_for('about', lang_code='en')\n\n        c = app.test_client()\n\n        self.assert_equal(c.get('/de/').data, b'/de/about')\n        self.assert_equal(c.get('/de/about').data, b'/foo')\n        self.assert_equal(c.get('/foo').data, b'/en/about')\n\n    def test_inject_blueprint_url_defaults(self):\n        app = flask.Flask(__name__)\n        bp = flask.Blueprint('foo.bar.baz', __name__,\n                       template_folder='template')\n\n        @bp.url_defaults\n        def bp_defaults(endpoint, values):\n            values['page'] = 'login'\n        @bp.route('/<page>')\n        def view(page): pass\n\n        app.register_blueprint(bp)\n\n        values = dict()\n        app.inject_url_defaults('foo.bar.baz.view', values)\n        expected = dict(page='login')\n        self.assert_equal(values, expected)\n\n        with app.test_request_context('/somepage'):\n            url = flask.url_for('foo.bar.baz.view')\n        expected = '/login'\n        self.assert_equal(url, expected)\n\n    def test_nonascii_pathinfo(self):\n        app = flask.Flask(__name__)\n        app.testing = True\n\n        @app.route(u'/киртест')\n        def index():\n            return 'Hello World!'\n\n        c = app.test_client()\n        rv = c.get(u'/киртест')\n        self.assert_equal(rv.data, b'Hello World!')\n\n    def test_debug_mode_complains_after_first_request(self):\n        app = flask.Flask(__name__)\n        app.debug = True\n        @app.route('/')\n        def index():\n            return 'Awesome'\n        self.assert_false(app.got_first_request)\n        self.assert_equal(app.test_client().get('/').data, b'Awesome')\n        try:\n            @app.route('/foo')\n            def broken():\n                return 'Meh'\n        except AssertionError as e:\n            self.assert_in('A setup function was called', str(e))\n        else:\n            self.fail('Expected exception')\n\n        app.debug = False\n        @app.route('/foo')\n        def working():\n            return 'Meh'\n        self.assert_equal(app.test_client().get('/foo').data, b'Meh')\n        self.assert_true(app.got_first_request)\n\n    def test_before_first_request_functions(self):\n        got = []\n        app = flask.Flask(__name__)\n        @app.before_first_request\n        def foo():\n            got.append(42)\n        c = app.test_client()\n        c.get('/')\n        self.assert_equal(got, [42])\n        c.get('/')\n        self.assert_equal(got, [42])\n        self.assert_true(app.got_first_request)\n\n    def test_routing_redirect_debugging(self):\n        app = flask.Flask(__name__)\n        app.debug = True\n        @app.route('/foo/', methods=['GET', 'POST'])\n        def foo():\n            return 'success'\n        with app.test_client() as c:\n            try:\n                c.post('/foo', data={})\n            except AssertionError as e:\n                self.assert_in('http://localhost/foo/', str(e))\n                self.assert_in('Make sure to directly send your POST-request '\n                               'to this URL', str(e))\n            else:\n                self.fail('Expected exception')\n\n            rv = c.get('/foo', data={}, follow_redirects=True)\n            self.assert_equal(rv.data, b'success')\n\n        app.debug = False\n        with app.test_client() as c:\n            rv = c.post('/foo', data={}, follow_redirects=True)\n            self.assert_equal(rv.data, b'success')\n\n    def test_route_decorator_custom_endpoint(self):\n        app = flask.Flask(__name__)\n        app.debug = True\n\n        @app.route('/foo/')\n        def foo():\n            return flask.request.endpoint\n\n        @app.route('/bar/', endpoint='bar')\n        def for_bar():\n            return flask.request.endpoint\n\n        @app.route('/bar/123', endpoint='123')\n        def for_bar_foo():\n            return flask.request.endpoint\n\n        with app.test_request_context():\n            assert flask.url_for('foo') == '/foo/'\n            assert flask.url_for('bar') == '/bar/'\n            assert flask.url_for('123') == '/bar/123'\n\n        c = app.test_client()\n        self.assertEqual(c.get('/foo/').data, b'foo')\n        self.assertEqual(c.get('/bar/').data, b'bar')\n        self.assertEqual(c.get('/bar/123').data, b'123')\n\n    def test_preserve_only_once(self):\n        app = flask.Flask(__name__)\n        app.debug = True\n\n        @app.route('/fail')\n        def fail_func():\n            1 // 0\n\n        c = app.test_client()\n        for x in range(3):\n            with self.assert_raises(ZeroDivisionError):\n                c.get('/fail')\n\n        self.assert_true(flask._request_ctx_stack.top is not None)\n        self.assert_true(flask._app_ctx_stack.top is not None)\n        # implicit appctx disappears too\n        flask._request_ctx_stack.top.pop()\n        self.assert_true(flask._request_ctx_stack.top is None)\n        self.assert_true(flask._app_ctx_stack.top is None)\n\n    def test_preserve_remembers_exception(self):\n        app = flask.Flask(__name__)\n        app.debug = True\n        errors = []\n\n        @app.route('/fail')\n        def fail_func():\n            1 // 0\n\n        @app.route('/success')\n        def success_func():\n            return 'Okay'\n\n        @app.teardown_request\n        def teardown_handler(exc):\n            errors.append(exc)\n\n        c = app.test_client()\n\n        # After this failure we did not yet call the teardown handler\n        with self.assert_raises(ZeroDivisionError):\n            c.get('/fail')\n        self.assert_equal(errors, [])\n\n        # But this request triggers it, and it's an error\n        c.get('/success')\n        self.assert_equal(len(errors), 2)\n        self.assert_true(isinstance(errors[0], ZeroDivisionError))\n\n        # At this point another request does nothing.\n        c.get('/success')\n        self.assert_equal(len(errors), 3)\n        self.assert_equal(errors[1], None)\n\n    def test_get_method_on_g(self):\n        app = flask.Flask(__name__)\n        app.testing = True\n\n        with app.app_context():\n            self.assert_equal(flask.g.get('x'), None)\n            self.assert_equal(flask.g.get('x', 11), 11)\n            flask.g.x = 42\n            self.assert_equal(flask.g.get('x'), 42)\n            self.assert_equal(flask.g.x, 42)\n\n    def test_g_iteration_protocol(self):\n        app = flask.Flask(__name__)\n        app.testing = True\n\n        with app.app_context():\n            flask.g.foo = 23\n            flask.g.bar = 42\n            self.assert_equal('foo' in flask.g, True)\n            self.assert_equal('foos' in flask.g, False)\n            self.assert_equal(sorted(flask.g), ['bar', 'foo'])\n\n\nclass SubdomainTestCase(FlaskTestCase):\n\n    def test_basic_support(self):\n        app = flask.Flask(__name__)\n        app.config['SERVER_NAME'] = 'localhost'\n        @app.route('/')\n        def normal_index():\n            return 'normal index'\n        @app.route('/', subdomain='test')\n        def test_index():\n            return 'test index'\n\n        c = app.test_client()\n        rv = c.get('/', 'http://localhost/')\n        self.assert_equal(rv.data, b'normal index')\n\n        rv = c.get('/', 'http://test.localhost/')\n        self.assert_equal(rv.data, b'test index')\n\n    @emits_module_deprecation_warning\n    def test_module_static_path_subdomain(self):\n        app = flask.Flask(__name__)\n        app.config['SERVER_NAME'] = 'example.com'\n        from subdomaintestmodule import mod\n        app.register_module(mod)\n        c = app.test_client()\n        rv = c.get('/static/hello.txt', 'http://foo.example.com/')\n        rv.direct_passthrough = False\n        self.assert_equal(rv.data.strip(), b'Hello Subdomain')\n        rv.close()\n\n    def test_subdomain_matching(self):\n        app = flask.Flask(__name__)\n        app.config['SERVER_NAME'] = 'localhost'\n        @app.route('/', subdomain='<user>')\n        def index(user):\n            return 'index for %s' % user\n\n        c = app.test_client()\n        rv = c.get('/', 'http://mitsuhiko.localhost/')\n        self.assert_equal(rv.data, b'index for mitsuhiko')\n\n    def test_subdomain_matching_with_ports(self):\n        app = flask.Flask(__name__)\n        app.config['SERVER_NAME'] = 'localhost:3000'\n        @app.route('/', subdomain='<user>')\n        def index(user):\n            return 'index for %s' % user\n\n        c = app.test_client()\n        rv = c.get('/', 'http://mitsuhiko.localhost:3000/')\n        self.assert_equal(rv.data, b'index for mitsuhiko')\n\n    @emits_module_deprecation_warning\n    def test_module_subdomain_support(self):\n        app = flask.Flask(__name__)\n        mod = flask.Module(__name__, 'test', subdomain='testing')\n        app.config['SERVER_NAME'] = 'localhost'\n\n        @mod.route('/test')\n        def test():\n            return 'Test'\n\n        @mod.route('/outside', subdomain='xtesting')\n        def bar():\n            return 'Outside'\n\n        app.register_module(mod)\n\n        c = app.test_client()\n        rv = c.get('/test', 'http://testing.localhost/')\n        self.assert_equal(rv.data, b'Test')\n        rv = c.get('/outside', 'http://xtesting.localhost/')\n        self.assert_equal(rv.data, b'Outside')\n\n\ndef suite():\n    suite = unittest.TestSuite()\n    suite.addTest(unittest.makeSuite(BasicFunctionalityTestCase))\n    suite.addTest(unittest.makeSuite(SubdomainTestCase))\n    return suite\n"
  },
  {
    "path": "lib/flask/testsuite/blueprints.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    flask.testsuite.blueprints\n    ~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n    Blueprints (and currently modules)\n\n    :copyright: (c) 2011 by Armin Ronacher.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\n\nimport flask\nimport unittest\nimport warnings\nfrom flask.testsuite import FlaskTestCase, emits_module_deprecation_warning\nfrom flask._compat import text_type\nfrom werkzeug.exceptions import NotFound\nfrom werkzeug.http import parse_cache_control_header\nfrom jinja2 import TemplateNotFound\n\n\n# import moduleapp here because it uses deprecated features and we don't\n# want to see the warnings\nwarnings.simplefilter('ignore', DeprecationWarning)\nfrom moduleapp import app as moduleapp\nwarnings.simplefilter('default', DeprecationWarning)\n\n\nclass ModuleTestCase(FlaskTestCase):\n\n    @emits_module_deprecation_warning\n    def test_basic_module(self):\n        app = flask.Flask(__name__)\n        admin = flask.Module(__name__, 'admin', url_prefix='/admin')\n        @admin.route('/')\n        def admin_index():\n            return 'admin index'\n        @admin.route('/login')\n        def admin_login():\n            return 'admin login'\n        @admin.route('/logout')\n        def admin_logout():\n            return 'admin logout'\n        @app.route('/')\n        def index():\n            return 'the index'\n        app.register_module(admin)\n        c = app.test_client()\n        self.assert_equal(c.get('/').data, b'the index')\n        self.assert_equal(c.get('/admin/').data, b'admin index')\n        self.assert_equal(c.get('/admin/login').data, b'admin login')\n        self.assert_equal(c.get('/admin/logout').data, b'admin logout')\n\n    @emits_module_deprecation_warning\n    def test_default_endpoint_name(self):\n        app = flask.Flask(__name__)\n        mod = flask.Module(__name__, 'frontend')\n        def index():\n            return 'Awesome'\n        mod.add_url_rule('/', view_func=index)\n        app.register_module(mod)\n        rv = app.test_client().get('/')\n        self.assert_equal(rv.data, b'Awesome')\n        with app.test_request_context():\n            self.assert_equal(flask.url_for('frontend.index'), '/')\n\n    @emits_module_deprecation_warning\n    def test_request_processing(self):\n        catched = []\n        app = flask.Flask(__name__)\n        admin = flask.Module(__name__, 'admin', url_prefix='/admin')\n        @admin.before_request\n        def before_admin_request():\n            catched.append('before-admin')\n        @admin.after_request\n        def after_admin_request(response):\n            catched.append('after-admin')\n            return response\n        @admin.route('/')\n        def admin_index():\n            return 'the admin'\n        @app.before_request\n        def before_request():\n            catched.append('before-app')\n        @app.after_request\n        def after_request(response):\n            catched.append('after-app')\n            return response\n        @app.route('/')\n        def index():\n            return 'the index'\n        app.register_module(admin)\n        c = app.test_client()\n\n        self.assert_equal(c.get('/').data, b'the index')\n        self.assert_equal(catched, ['before-app', 'after-app'])\n        del catched[:]\n\n        self.assert_equal(c.get('/admin/').data, b'the admin')\n        self.assert_equal(catched, ['before-app', 'before-admin',\n                           'after-admin', 'after-app'])\n\n    @emits_module_deprecation_warning\n    def test_context_processors(self):\n        app = flask.Flask(__name__)\n        admin = flask.Module(__name__, 'admin', url_prefix='/admin')\n        @app.context_processor\n        def inject_all_regular():\n            return {'a': 1}\n        @admin.context_processor\n        def inject_admin():\n            return {'b': 2}\n        @admin.app_context_processor\n        def inject_all_module():\n            return {'c': 3}\n        @app.route('/')\n        def index():\n            return flask.render_template_string('{{ a }}{{ b }}{{ c }}')\n        @admin.route('/')\n        def admin_index():\n            return flask.render_template_string('{{ a }}{{ b }}{{ c }}')\n        app.register_module(admin)\n        c = app.test_client()\n        self.assert_equal(c.get('/').data, b'13')\n        self.assert_equal(c.get('/admin/').data, b'123')\n\n    @emits_module_deprecation_warning\n    def test_late_binding(self):\n        app = flask.Flask(__name__)\n        admin = flask.Module(__name__, 'admin')\n        @admin.route('/')\n        def index():\n            return '42'\n        app.register_module(admin, url_prefix='/admin')\n        self.assert_equal(app.test_client().get('/admin/').data, b'42')\n\n    @emits_module_deprecation_warning\n    def test_error_handling(self):\n        app = flask.Flask(__name__)\n        admin = flask.Module(__name__, 'admin')\n        @admin.app_errorhandler(404)\n        def not_found(e):\n            return 'not found', 404\n        @admin.app_errorhandler(500)\n        def internal_server_error(e):\n            return 'internal server error', 500\n        @admin.route('/')\n        def index():\n            flask.abort(404)\n        @admin.route('/error')\n        def error():\n            1 // 0\n        app.register_module(admin)\n        c = app.test_client()\n        rv = c.get('/')\n        self.assert_equal(rv.status_code, 404)\n        self.assert_equal(rv.data, b'not found')\n        rv = c.get('/error')\n        self.assert_equal(rv.status_code, 500)\n        self.assert_equal(b'internal server error', rv.data)\n\n    def test_templates_and_static(self):\n        app = moduleapp\n        app.testing = True\n        c = app.test_client()\n\n        rv = c.get('/')\n        self.assert_equal(rv.data, b'Hello from the Frontend')\n        rv = c.get('/admin/')\n        self.assert_equal(rv.data, b'Hello from the Admin')\n        rv = c.get('/admin/index2')\n        self.assert_equal(rv.data, b'Hello from the Admin')\n        rv = c.get('/admin/static/test.txt')\n        self.assert_equal(rv.data.strip(), b'Admin File')\n        rv.close()\n        rv = c.get('/admin/static/css/test.css')\n        self.assert_equal(rv.data.strip(), b'/* nested file */')\n        rv.close()\n\n        with app.test_request_context():\n            self.assert_equal(flask.url_for('admin.static', filename='test.txt'),\n                              '/admin/static/test.txt')\n\n        with app.test_request_context():\n            try:\n                flask.render_template('missing.html')\n            except TemplateNotFound as e:\n                self.assert_equal(e.name, 'missing.html')\n            else:\n                self.assert_true(0, 'expected exception')\n\n        with flask.Flask(__name__).test_request_context():\n            self.assert_equal(flask.render_template('nested/nested.txt'), 'I\\'m nested')\n\n    def test_safe_access(self):\n        app = moduleapp\n\n        with app.test_request_context():\n            f = app.view_functions['admin.static']\n\n            try:\n                f('/etc/passwd')\n            except NotFound:\n                pass\n            else:\n                self.assert_true(0, 'expected exception')\n            try:\n                f('../__init__.py')\n            except NotFound:\n                pass\n            else:\n                self.assert_true(0, 'expected exception')\n\n            # testcase for a security issue that may exist on windows systems\n            import os\n            import ntpath\n            old_path = os.path\n            os.path = ntpath\n            try:\n                try:\n                    f('..\\\\__init__.py')\n                except NotFound:\n                    pass\n                else:\n                    self.assert_true(0, 'expected exception')\n            finally:\n                os.path = old_path\n\n    @emits_module_deprecation_warning\n    def test_endpoint_decorator(self):\n        from werkzeug.routing import Submount, Rule\n        from flask import Module\n\n        app = flask.Flask(__name__)\n        app.testing = True\n        app.url_map.add(Submount('/foo', [\n            Rule('/bar', endpoint='bar'),\n            Rule('/', endpoint='index')\n        ]))\n        module = Module(__name__, __name__)\n\n        @module.endpoint('bar')\n        def bar():\n            return 'bar'\n\n        @module.endpoint('index')\n        def index():\n            return 'index'\n\n        app.register_module(module)\n\n        c = app.test_client()\n        self.assert_equal(c.get('/foo/').data, b'index')\n        self.assert_equal(c.get('/foo/bar').data, b'bar')\n\n\nclass BlueprintTestCase(FlaskTestCase):\n\n    def test_blueprint_specific_error_handling(self):\n        frontend = flask.Blueprint('frontend', __name__)\n        backend = flask.Blueprint('backend', __name__)\n        sideend = flask.Blueprint('sideend', __name__)\n\n        @frontend.errorhandler(403)\n        def frontend_forbidden(e):\n            return 'frontend says no', 403\n\n        @frontend.route('/frontend-no')\n        def frontend_no():\n            flask.abort(403)\n\n        @backend.errorhandler(403)\n        def backend_forbidden(e):\n            return 'backend says no', 403\n\n        @backend.route('/backend-no')\n        def backend_no():\n            flask.abort(403)\n\n        @sideend.route('/what-is-a-sideend')\n        def sideend_no():\n            flask.abort(403)\n\n        app = flask.Flask(__name__)\n        app.register_blueprint(frontend)\n        app.register_blueprint(backend)\n        app.register_blueprint(sideend)\n\n        @app.errorhandler(403)\n        def app_forbidden(e):\n            return 'application itself says no', 403\n\n        c = app.test_client()\n\n        self.assert_equal(c.get('/frontend-no').data, b'frontend says no')\n        self.assert_equal(c.get('/backend-no').data, b'backend says no')\n        self.assert_equal(c.get('/what-is-a-sideend').data, b'application itself says no')\n\n    def test_blueprint_url_definitions(self):\n        bp = flask.Blueprint('test', __name__)\n\n        @bp.route('/foo', defaults={'baz': 42})\n        def foo(bar, baz):\n            return '%s/%d' % (bar, baz)\n\n        @bp.route('/bar')\n        def bar(bar):\n            return text_type(bar)\n\n        app = flask.Flask(__name__)\n        app.register_blueprint(bp, url_prefix='/1', url_defaults={'bar': 23})\n        app.register_blueprint(bp, url_prefix='/2', url_defaults={'bar': 19})\n\n        c = app.test_client()\n        self.assert_equal(c.get('/1/foo').data, b'23/42')\n        self.assert_equal(c.get('/2/foo').data, b'19/42')\n        self.assert_equal(c.get('/1/bar').data, b'23')\n        self.assert_equal(c.get('/2/bar').data, b'19')\n\n    def test_blueprint_url_processors(self):\n        bp = flask.Blueprint('frontend', __name__, url_prefix='/<lang_code>')\n\n        @bp.url_defaults\n        def add_language_code(endpoint, values):\n            values.setdefault('lang_code', flask.g.lang_code)\n\n        @bp.url_value_preprocessor\n        def pull_lang_code(endpoint, values):\n            flask.g.lang_code = values.pop('lang_code')\n\n        @bp.route('/')\n        def index():\n            return flask.url_for('.about')\n\n        @bp.route('/about')\n        def about():\n            return flask.url_for('.index')\n\n        app = flask.Flask(__name__)\n        app.register_blueprint(bp)\n\n        c = app.test_client()\n\n        self.assert_equal(c.get('/de/').data, b'/de/about')\n        self.assert_equal(c.get('/de/about').data, b'/de/')\n\n    def test_templates_and_static(self):\n        from blueprintapp import app\n        c = app.test_client()\n\n        rv = c.get('/')\n        self.assert_equal(rv.data, b'Hello from the Frontend')\n        rv = c.get('/admin/')\n        self.assert_equal(rv.data, b'Hello from the Admin')\n        rv = c.get('/admin/index2')\n        self.assert_equal(rv.data, b'Hello from the Admin')\n        rv = c.get('/admin/static/test.txt')\n        self.assert_equal(rv.data.strip(), b'Admin File')\n        rv.close()\n        rv = c.get('/admin/static/css/test.css')\n        self.assert_equal(rv.data.strip(), b'/* nested file */')\n        rv.close()\n\n        # try/finally, in case other tests use this app for Blueprint tests.\n        max_age_default = app.config['SEND_FILE_MAX_AGE_DEFAULT']\n        try:\n            expected_max_age = 3600\n            if app.config['SEND_FILE_MAX_AGE_DEFAULT'] == expected_max_age:\n                expected_max_age = 7200\n            app.config['SEND_FILE_MAX_AGE_DEFAULT'] = expected_max_age\n            rv = c.get('/admin/static/css/test.css')\n            cc = parse_cache_control_header(rv.headers['Cache-Control'])\n            self.assert_equal(cc.max_age, expected_max_age)\n            rv.close()\n        finally:\n            app.config['SEND_FILE_MAX_AGE_DEFAULT'] = max_age_default\n\n        with app.test_request_context():\n            self.assert_equal(flask.url_for('admin.static', filename='test.txt'),\n                              '/admin/static/test.txt')\n\n        with app.test_request_context():\n            try:\n                flask.render_template('missing.html')\n            except TemplateNotFound as e:\n                self.assert_equal(e.name, 'missing.html')\n            else:\n                self.assert_true(0, 'expected exception')\n\n        with flask.Flask(__name__).test_request_context():\n            self.assert_equal(flask.render_template('nested/nested.txt'), 'I\\'m nested')\n\n    def test_default_static_cache_timeout(self):\n        app = flask.Flask(__name__)\n        class MyBlueprint(flask.Blueprint):\n            def get_send_file_max_age(self, filename):\n                return 100\n\n        blueprint = MyBlueprint('blueprint', __name__, static_folder='static')\n        app.register_blueprint(blueprint)\n\n        # try/finally, in case other tests use this app for Blueprint tests.\n        max_age_default = app.config['SEND_FILE_MAX_AGE_DEFAULT']\n        try:\n            with app.test_request_context():\n                unexpected_max_age = 3600\n                if app.config['SEND_FILE_MAX_AGE_DEFAULT'] == unexpected_max_age:\n                    unexpected_max_age = 7200\n                app.config['SEND_FILE_MAX_AGE_DEFAULT'] = unexpected_max_age\n                rv = blueprint.send_static_file('index.html')\n                cc = parse_cache_control_header(rv.headers['Cache-Control'])\n                self.assert_equal(cc.max_age, 100)\n                rv.close()\n        finally:\n            app.config['SEND_FILE_MAX_AGE_DEFAULT'] = max_age_default\n\n    def test_templates_list(self):\n        from blueprintapp import app\n        templates = sorted(app.jinja_env.list_templates())\n        self.assert_equal(templates, ['admin/index.html',\n                                     'frontend/index.html'])\n\n    def test_dotted_names(self):\n        frontend = flask.Blueprint('myapp.frontend', __name__)\n        backend = flask.Blueprint('myapp.backend', __name__)\n\n        @frontend.route('/fe')\n        def frontend_index():\n            return flask.url_for('myapp.backend.backend_index')\n\n        @frontend.route('/fe2')\n        def frontend_page2():\n            return flask.url_for('.frontend_index')\n\n        @backend.route('/be')\n        def backend_index():\n            return flask.url_for('myapp.frontend.frontend_index')\n\n        app = flask.Flask(__name__)\n        app.register_blueprint(frontend)\n        app.register_blueprint(backend)\n\n        c = app.test_client()\n        self.assert_equal(c.get('/fe').data.strip(), b'/be')\n        self.assert_equal(c.get('/fe2').data.strip(), b'/fe')\n        self.assert_equal(c.get('/be').data.strip(), b'/fe')\n\n    def test_dotted_names_from_app(self):\n        app = flask.Flask(__name__)\n        app.testing = True\n        test = flask.Blueprint('test', __name__)\n\n        @app.route('/')\n        def app_index():\n            return flask.url_for('test.index')\n\n        @test.route('/test/')\n        def index():\n            return flask.url_for('app_index')\n\n        app.register_blueprint(test)\n\n        with app.test_client() as c:\n            rv = c.get('/')\n            self.assert_equal(rv.data, b'/test/')\n\n    def test_empty_url_defaults(self):\n        bp = flask.Blueprint('bp', __name__)\n\n        @bp.route('/', defaults={'page': 1})\n        @bp.route('/page/<int:page>')\n        def something(page):\n            return str(page)\n\n        app = flask.Flask(__name__)\n        app.register_blueprint(bp)\n\n        c = app.test_client()\n        self.assert_equal(c.get('/').data, b'1')\n        self.assert_equal(c.get('/page/2').data, b'2')\n\n    def test_route_decorator_custom_endpoint(self):\n\n        bp = flask.Blueprint('bp', __name__)\n\n        @bp.route('/foo')\n        def foo():\n            return flask.request.endpoint\n\n        @bp.route('/bar', endpoint='bar')\n        def foo_bar():\n            return flask.request.endpoint\n\n        @bp.route('/bar/123', endpoint='123')\n        def foo_bar_foo():\n            return flask.request.endpoint\n\n        @bp.route('/bar/foo')\n        def bar_foo():\n            return flask.request.endpoint\n\n        app = flask.Flask(__name__)\n        app.register_blueprint(bp, url_prefix='/py')\n\n        @app.route('/')\n        def index():\n            return flask.request.endpoint\n\n        c = app.test_client()\n        self.assertEqual(c.get('/').data, b'index')\n        self.assertEqual(c.get('/py/foo').data, b'bp.foo')\n        self.assertEqual(c.get('/py/bar').data, b'bp.bar')\n        self.assertEqual(c.get('/py/bar/123').data, b'bp.123')\n        self.assertEqual(c.get('/py/bar/foo').data, b'bp.bar_foo')\n\n    def test_route_decorator_custom_endpoint_with_dots(self):\n        bp = flask.Blueprint('bp', __name__)\n\n        @bp.route('/foo')\n        def foo():\n            return flask.request.endpoint\n\n        try:\n            @bp.route('/bar', endpoint='bar.bar')\n            def foo_bar():\n                return flask.request.endpoint\n        except AssertionError:\n            pass\n        else:\n            raise AssertionError('expected AssertionError not raised')\n\n        try:\n            @bp.route('/bar/123', endpoint='bar.123')\n            def foo_bar_foo():\n                return flask.request.endpoint\n        except AssertionError:\n            pass\n        else:\n            raise AssertionError('expected AssertionError not raised')\n\n        def foo_foo_foo():\n            pass\n\n        self.assertRaises(\n            AssertionError,\n            lambda: bp.add_url_rule(\n                '/bar/123', endpoint='bar.123', view_func=foo_foo_foo\n            )\n        )\n\n        self.assertRaises(\n            AssertionError,\n            bp.route('/bar/123', endpoint='bar.123'),\n            lambda: None\n        )\n\n        app = flask.Flask(__name__)\n        app.register_blueprint(bp, url_prefix='/py')\n\n        c = app.test_client()\n        self.assertEqual(c.get('/py/foo').data, b'bp.foo')\n        # The rule's didn't actually made it through\n        rv = c.get('/py/bar')\n        assert rv.status_code == 404\n        rv = c.get('/py/bar/123')\n        assert rv.status_code == 404\n\n    def test_template_filter(self):\n        bp = flask.Blueprint('bp', __name__)\n        @bp.app_template_filter()\n        def my_reverse(s):\n            return s[::-1]\n        app = flask.Flask(__name__)\n        app.register_blueprint(bp, url_prefix='/py')\n        self.assert_in('my_reverse', app.jinja_env.filters.keys())\n        self.assert_equal(app.jinja_env.filters['my_reverse'], my_reverse)\n        self.assert_equal(app.jinja_env.filters['my_reverse']('abcd'), 'dcba')\n\n    def test_add_template_filter(self):\n        bp = flask.Blueprint('bp', __name__)\n        def my_reverse(s):\n            return s[::-1]\n        bp.add_app_template_filter(my_reverse)\n        app = flask.Flask(__name__)\n        app.register_blueprint(bp, url_prefix='/py')\n        self.assert_in('my_reverse', app.jinja_env.filters.keys())\n        self.assert_equal(app.jinja_env.filters['my_reverse'], my_reverse)\n        self.assert_equal(app.jinja_env.filters['my_reverse']('abcd'), 'dcba')\n\n    def test_template_filter_with_name(self):\n        bp = flask.Blueprint('bp', __name__)\n        @bp.app_template_filter('strrev')\n        def my_reverse(s):\n            return s[::-1]\n        app = flask.Flask(__name__)\n        app.register_blueprint(bp, url_prefix='/py')\n        self.assert_in('strrev', app.jinja_env.filters.keys())\n        self.assert_equal(app.jinja_env.filters['strrev'], my_reverse)\n        self.assert_equal(app.jinja_env.filters['strrev']('abcd'), 'dcba')\n\n    def test_add_template_filter_with_name(self):\n        bp = flask.Blueprint('bp', __name__)\n        def my_reverse(s):\n            return s[::-1]\n        bp.add_app_template_filter(my_reverse, 'strrev')\n        app = flask.Flask(__name__)\n        app.register_blueprint(bp, url_prefix='/py')\n        self.assert_in('strrev', app.jinja_env.filters.keys())\n        self.assert_equal(app.jinja_env.filters['strrev'], my_reverse)\n        self.assert_equal(app.jinja_env.filters['strrev']('abcd'), 'dcba')\n\n    def test_template_filter_with_template(self):\n        bp = flask.Blueprint('bp', __name__)\n        @bp.app_template_filter()\n        def super_reverse(s):\n            return s[::-1]\n        app = flask.Flask(__name__)\n        app.register_blueprint(bp, url_prefix='/py')\n        @app.route('/')\n        def index():\n            return flask.render_template('template_filter.html', value='abcd')\n        rv = app.test_client().get('/')\n        self.assert_equal(rv.data, b'dcba')\n\n    def test_template_filter_after_route_with_template(self):\n        app = flask.Flask(__name__)\n        @app.route('/')\n        def index():\n            return flask.render_template('template_filter.html', value='abcd')\n        bp = flask.Blueprint('bp', __name__)\n        @bp.app_template_filter()\n        def super_reverse(s):\n            return s[::-1]\n        app.register_blueprint(bp, url_prefix='/py')\n        rv = app.test_client().get('/')\n        self.assert_equal(rv.data, b'dcba')\n\n    def test_add_template_filter_with_template(self):\n        bp = flask.Blueprint('bp', __name__)\n        def super_reverse(s):\n            return s[::-1]\n        bp.add_app_template_filter(super_reverse)\n        app = flask.Flask(__name__)\n        app.register_blueprint(bp, url_prefix='/py')\n        @app.route('/')\n        def index():\n            return flask.render_template('template_filter.html', value='abcd')\n        rv = app.test_client().get('/')\n        self.assert_equal(rv.data, b'dcba')\n\n    def test_template_filter_with_name_and_template(self):\n        bp = flask.Blueprint('bp', __name__)\n        @bp.app_template_filter('super_reverse')\n        def my_reverse(s):\n            return s[::-1]\n        app = flask.Flask(__name__)\n        app.register_blueprint(bp, url_prefix='/py')\n        @app.route('/')\n        def index():\n            return flask.render_template('template_filter.html', value='abcd')\n        rv = app.test_client().get('/')\n        self.assert_equal(rv.data, b'dcba')\n\n    def test_add_template_filter_with_name_and_template(self):\n        bp = flask.Blueprint('bp', __name__)\n        def my_reverse(s):\n            return s[::-1]\n        bp.add_app_template_filter(my_reverse, 'super_reverse')\n        app = flask.Flask(__name__)\n        app.register_blueprint(bp, url_prefix='/py')\n        @app.route('/')\n        def index():\n            return flask.render_template('template_filter.html', value='abcd')\n        rv = app.test_client().get('/')\n        self.assert_equal(rv.data, b'dcba')\n\n    def test_template_test(self):\n        bp = flask.Blueprint('bp', __name__)\n        @bp.app_template_test()\n        def is_boolean(value):\n            return isinstance(value, bool)\n        app = flask.Flask(__name__)\n        app.register_blueprint(bp, url_prefix='/py')\n        self.assert_in('is_boolean', app.jinja_env.tests.keys())\n        self.assert_equal(app.jinja_env.tests['is_boolean'], is_boolean)\n        self.assert_true(app.jinja_env.tests['is_boolean'](False))\n\n    def test_add_template_test(self):\n        bp = flask.Blueprint('bp', __name__)\n        def is_boolean(value):\n            return isinstance(value, bool)\n        bp.add_app_template_test(is_boolean)\n        app = flask.Flask(__name__)\n        app.register_blueprint(bp, url_prefix='/py')\n        self.assert_in('is_boolean', app.jinja_env.tests.keys())\n        self.assert_equal(app.jinja_env.tests['is_boolean'], is_boolean)\n        self.assert_true(app.jinja_env.tests['is_boolean'](False))\n\n    def test_template_test_with_name(self):\n        bp = flask.Blueprint('bp', __name__)\n        @bp.app_template_test('boolean')\n        def is_boolean(value):\n            return isinstance(value, bool)\n        app = flask.Flask(__name__)\n        app.register_blueprint(bp, url_prefix='/py')\n        self.assert_in('boolean', app.jinja_env.tests.keys())\n        self.assert_equal(app.jinja_env.tests['boolean'], is_boolean)\n        self.assert_true(app.jinja_env.tests['boolean'](False))\n\n    def test_add_template_test_with_name(self):\n        bp = flask.Blueprint('bp', __name__)\n        def is_boolean(value):\n            return isinstance(value, bool)\n        bp.add_app_template_test(is_boolean, 'boolean')\n        app = flask.Flask(__name__)\n        app.register_blueprint(bp, url_prefix='/py')\n        self.assert_in('boolean', app.jinja_env.tests.keys())\n        self.assert_equal(app.jinja_env.tests['boolean'], is_boolean)\n        self.assert_true(app.jinja_env.tests['boolean'](False))\n\n    def test_template_test_with_template(self):\n        bp = flask.Blueprint('bp', __name__)\n        @bp.app_template_test()\n        def boolean(value):\n            return isinstance(value, bool)\n        app = flask.Flask(__name__)\n        app.register_blueprint(bp, url_prefix='/py')\n        @app.route('/')\n        def index():\n            return flask.render_template('template_test.html', value=False)\n        rv = app.test_client().get('/')\n        self.assert_in(b'Success!', rv.data)\n\n    def test_template_test_after_route_with_template(self):\n        app = flask.Flask(__name__)\n        @app.route('/')\n        def index():\n            return flask.render_template('template_test.html', value=False)\n        bp = flask.Blueprint('bp', __name__)\n        @bp.app_template_test()\n        def boolean(value):\n            return isinstance(value, bool)\n        app.register_blueprint(bp, url_prefix='/py')\n        rv = app.test_client().get('/')\n        self.assert_in(b'Success!', rv.data)\n\n    def test_add_template_test_with_template(self):\n        bp = flask.Blueprint('bp', __name__)\n        def boolean(value):\n            return isinstance(value, bool)\n        bp.add_app_template_test(boolean)\n        app = flask.Flask(__name__)\n        app.register_blueprint(bp, url_prefix='/py')\n        @app.route('/')\n        def index():\n            return flask.render_template('template_test.html', value=False)\n        rv = app.test_client().get('/')\n        self.assert_in(b'Success!', rv.data)\n\n    def test_template_test_with_name_and_template(self):\n        bp = flask.Blueprint('bp', __name__)\n        @bp.app_template_test('boolean')\n        def is_boolean(value):\n            return isinstance(value, bool)\n        app = flask.Flask(__name__)\n        app.register_blueprint(bp, url_prefix='/py')\n        @app.route('/')\n        def index():\n            return flask.render_template('template_test.html', value=False)\n        rv = app.test_client().get('/')\n        self.assert_in(b'Success!', rv.data)\n\n    def test_add_template_test_with_name_and_template(self):\n        bp = flask.Blueprint('bp', __name__)\n        def is_boolean(value):\n            return isinstance(value, bool)\n        bp.add_app_template_test(is_boolean, 'boolean')\n        app = flask.Flask(__name__)\n        app.register_blueprint(bp, url_prefix='/py')\n        @app.route('/')\n        def index():\n            return flask.render_template('template_test.html', value=False)\n        rv = app.test_client().get('/')\n        self.assert_in(b'Success!', rv.data)\n\ndef suite():\n    suite = unittest.TestSuite()\n    suite.addTest(unittest.makeSuite(BlueprintTestCase))\n    suite.addTest(unittest.makeSuite(ModuleTestCase))\n    return suite\n"
  },
  {
    "path": "lib/flask/testsuite/config.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    flask.testsuite.config\n    ~~~~~~~~~~~~~~~~~~~~~~\n\n    Configuration and instances.\n\n    :copyright: (c) 2011 by Armin Ronacher.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\n\nimport os\nimport sys\nimport flask\nimport pkgutil\nimport unittest\nfrom contextlib import contextmanager\nfrom flask.testsuite import FlaskTestCase\n\n\n# config keys used for the ConfigTestCase\nTEST_KEY = 'foo'\nSECRET_KEY = 'devkey'\n\n\nclass ConfigTestCase(FlaskTestCase):\n\n    def common_object_test(self, app):\n        self.assert_equal(app.secret_key, 'devkey')\n        self.assert_equal(app.config['TEST_KEY'], 'foo')\n        self.assert_not_in('ConfigTestCase', app.config)\n\n    def test_config_from_file(self):\n        app = flask.Flask(__name__)\n        app.config.from_pyfile(__file__.rsplit('.', 1)[0] + '.py')\n        self.common_object_test(app)\n\n    def test_config_from_object(self):\n        app = flask.Flask(__name__)\n        app.config.from_object(__name__)\n        self.common_object_test(app)\n\n    def test_config_from_class(self):\n        class Base(object):\n            TEST_KEY = 'foo'\n        class Test(Base):\n            SECRET_KEY = 'devkey'\n        app = flask.Flask(__name__)\n        app.config.from_object(Test)\n        self.common_object_test(app)\n\n    def test_config_from_envvar(self):\n        env = os.environ\n        try:\n            os.environ = {}\n            app = flask.Flask(__name__)\n            try:\n                app.config.from_envvar('FOO_SETTINGS')\n            except RuntimeError as e:\n                self.assert_true(\"'FOO_SETTINGS' is not set\" in str(e))\n            else:\n                self.assert_true(0, 'expected exception')\n            self.assert_false(app.config.from_envvar('FOO_SETTINGS', silent=True))\n\n            os.environ = {'FOO_SETTINGS': __file__.rsplit('.', 1)[0] + '.py'}\n            self.assert_true(app.config.from_envvar('FOO_SETTINGS'))\n            self.common_object_test(app)\n        finally:\n            os.environ = env\n\n    def test_config_from_envvar_missing(self):\n        env = os.environ\n        try:\n            os.environ = {'FOO_SETTINGS': 'missing.cfg'}\n            try:\n                app = flask.Flask(__name__)\n                app.config.from_envvar('FOO_SETTINGS')\n            except IOError as e:\n                msg = str(e)\n                self.assert_true(msg.startswith('[Errno 2] Unable to load configuration '\n                                            'file (No such file or directory):'))\n                self.assert_true(msg.endswith(\"missing.cfg'\"))\n            else:\n                self.fail('expected IOError')\n            self.assertFalse(app.config.from_envvar('FOO_SETTINGS', silent=True))\n        finally:\n            os.environ = env\n\n    def test_config_missing(self):\n        app = flask.Flask(__name__)\n        try:\n            app.config.from_pyfile('missing.cfg')\n        except IOError as e:\n            msg = str(e)\n            self.assert_true(msg.startswith('[Errno 2] Unable to load configuration '\n                                        'file (No such file or directory):'))\n            self.assert_true(msg.endswith(\"missing.cfg'\"))\n        else:\n            self.assert_true(0, 'expected config')\n        self.assert_false(app.config.from_pyfile('missing.cfg', silent=True))\n\n    def test_session_lifetime(self):\n        app = flask.Flask(__name__)\n        app.config['PERMANENT_SESSION_LIFETIME'] = 42\n        self.assert_equal(app.permanent_session_lifetime.seconds, 42)\n\n\nclass LimitedLoaderMockWrapper(object):\n    def __init__(self, loader):\n        self.loader = loader\n\n    def __getattr__(self, name):\n        if name in ('archive', 'get_filename'):\n            msg = 'Mocking a loader which does not have `%s.`' % name\n            raise AttributeError(msg)\n        return getattr(self.loader, name)\n\n\n@contextmanager\ndef patch_pkgutil_get_loader(wrapper_class=LimitedLoaderMockWrapper):\n    \"\"\"Patch pkgutil.get_loader to give loader without get_filename or archive.\n\n    This provides for tests where a system has custom loaders, e.g. Google App\n    Engine's HardenedModulesHook, which have neither the `get_filename` method\n    nor the `archive` attribute.\n    \"\"\"\n    old_get_loader = pkgutil.get_loader\n    def get_loader(*args, **kwargs):\n        return wrapper_class(old_get_loader(*args, **kwargs))\n    try:\n        pkgutil.get_loader = get_loader\n        yield\n    finally:\n        pkgutil.get_loader = old_get_loader\n\n\nclass InstanceTestCase(FlaskTestCase):\n\n    def test_explicit_instance_paths(self):\n        here = os.path.abspath(os.path.dirname(__file__))\n        try:\n            flask.Flask(__name__, instance_path='instance')\n        except ValueError as e:\n            self.assert_in('must be absolute', str(e))\n        else:\n            self.fail('Expected value error')\n\n        app = flask.Flask(__name__, instance_path=here)\n        self.assert_equal(app.instance_path, here)\n\n    def test_main_module_paths(self):\n        # Test an app with '__main__' as the import name, uses cwd.\n        from main_app import app\n        here = os.path.abspath(os.getcwd())\n        self.assert_equal(app.instance_path, os.path.join(here, 'instance'))\n        if 'main_app' in sys.modules:\n            del sys.modules['main_app']\n\n    def test_uninstalled_module_paths(self):\n        from config_module_app import app\n        here = os.path.abspath(os.path.dirname(__file__))\n        self.assert_equal(app.instance_path, os.path.join(here, 'test_apps', 'instance'))\n\n    def test_uninstalled_package_paths(self):\n        from config_package_app import app\n        here = os.path.abspath(os.path.dirname(__file__))\n        self.assert_equal(app.instance_path, os.path.join(here, 'test_apps', 'instance'))\n\n    def test_installed_module_paths(self):\n        here = os.path.abspath(os.path.dirname(__file__))\n        expected_prefix = os.path.join(here, 'test_apps')\n        real_prefix, sys.prefix = sys.prefix, expected_prefix\n        site_packages = os.path.join(expected_prefix, 'lib', 'python2.5', 'site-packages')\n        sys.path.append(site_packages)\n        try:\n            import site_app\n            self.assert_equal(site_app.app.instance_path,\n                              os.path.join(expected_prefix, 'var',\n                                           'site_app-instance'))\n        finally:\n            sys.prefix = real_prefix\n            sys.path.remove(site_packages)\n            if 'site_app' in sys.modules:\n                del sys.modules['site_app']\n\n    def test_installed_module_paths_with_limited_loader(self):\n        here = os.path.abspath(os.path.dirname(__file__))\n        expected_prefix = os.path.join(here, 'test_apps')\n        real_prefix, sys.prefix = sys.prefix, expected_prefix\n        site_packages = os.path.join(expected_prefix, 'lib', 'python2.5', 'site-packages')\n        sys.path.append(site_packages)\n        with patch_pkgutil_get_loader():\n            try:\n                import site_app\n                self.assert_equal(site_app.app.instance_path,\n                                  os.path.join(expected_prefix, 'var',\n                                               'site_app-instance'))\n            finally:\n                sys.prefix = real_prefix\n                sys.path.remove(site_packages)\n                if 'site_app' in sys.modules:\n                    del sys.modules['site_app']\n\n    def test_installed_package_paths(self):\n        here = os.path.abspath(os.path.dirname(__file__))\n        expected_prefix = os.path.join(here, 'test_apps')\n        real_prefix, sys.prefix = sys.prefix, expected_prefix\n        installed_path = os.path.join(expected_prefix, 'path')\n        sys.path.append(installed_path)\n        try:\n            import installed_package\n            self.assert_equal(installed_package.app.instance_path,\n                              os.path.join(expected_prefix, 'var',\n                                           'installed_package-instance'))\n        finally:\n            sys.prefix = real_prefix\n            sys.path.remove(installed_path)\n            if 'installed_package' in sys.modules:\n                del sys.modules['installed_package']\n\n    def test_installed_package_paths_with_limited_loader(self):\n        here = os.path.abspath(os.path.dirname(__file__))\n        expected_prefix = os.path.join(here, 'test_apps')\n        real_prefix, sys.prefix = sys.prefix, expected_prefix\n        installed_path = os.path.join(expected_prefix, 'path')\n        sys.path.append(installed_path)\n        with patch_pkgutil_get_loader():\n            try:\n                import installed_package\n                self.assert_equal(installed_package.app.instance_path,\n                                  os.path.join(expected_prefix, 'var',\n                                               'installed_package-instance'))\n            finally:\n                sys.prefix = real_prefix\n                sys.path.remove(installed_path)\n                if 'installed_package' in sys.modules:\n                    del sys.modules['installed_package']\n\n    def test_prefix_package_paths(self):\n        here = os.path.abspath(os.path.dirname(__file__))\n        expected_prefix = os.path.join(here, 'test_apps')\n        real_prefix, sys.prefix = sys.prefix, expected_prefix\n        site_packages = os.path.join(expected_prefix, 'lib', 'python2.5', 'site-packages')\n        sys.path.append(site_packages)\n        try:\n            import site_package\n            self.assert_equal(site_package.app.instance_path,\n                              os.path.join(expected_prefix, 'var',\n                                           'site_package-instance'))\n        finally:\n            sys.prefix = real_prefix\n            sys.path.remove(site_packages)\n            if 'site_package' in sys.modules:\n                del sys.modules['site_package']\n\n    def test_prefix_package_paths_with_limited_loader(self):\n        here = os.path.abspath(os.path.dirname(__file__))\n        expected_prefix = os.path.join(here, 'test_apps')\n        real_prefix, sys.prefix = sys.prefix, expected_prefix\n        site_packages = os.path.join(expected_prefix, 'lib', 'python2.5', 'site-packages')\n        sys.path.append(site_packages)\n        with patch_pkgutil_get_loader():\n            try:\n                import site_package\n                self.assert_equal(site_package.app.instance_path,\n                                  os.path.join(expected_prefix, 'var',\n                                               'site_package-instance'))\n            finally:\n                sys.prefix = real_prefix\n                sys.path.remove(site_packages)\n                if 'site_package' in sys.modules:\n                    del sys.modules['site_package']\n\n    def test_egg_installed_paths(self):\n        here = os.path.abspath(os.path.dirname(__file__))\n        expected_prefix = os.path.join(here, 'test_apps')\n        real_prefix, sys.prefix = sys.prefix, expected_prefix\n        site_packages = os.path.join(expected_prefix, 'lib', 'python2.5', 'site-packages')\n        egg_path = os.path.join(site_packages, 'SiteEgg.egg')\n        sys.path.append(site_packages)\n        sys.path.append(egg_path)\n        try:\n            import site_egg # in SiteEgg.egg\n            self.assert_equal(site_egg.app.instance_path,\n                              os.path.join(expected_prefix, 'var',\n                                           'site_egg-instance'))\n        finally:\n            sys.prefix = real_prefix\n            sys.path.remove(site_packages)\n            sys.path.remove(egg_path)\n            if 'site_egg' in sys.modules:\n                del sys.modules['site_egg']\n\n\ndef suite():\n    suite = unittest.TestSuite()\n    suite.addTest(unittest.makeSuite(ConfigTestCase))\n    suite.addTest(unittest.makeSuite(InstanceTestCase))\n    return suite\n"
  },
  {
    "path": "lib/flask/testsuite/deprecations.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    flask.testsuite.deprecations\n    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n    Tests deprecation support.\n\n    :copyright: (c) 2011 by Armin Ronacher.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\n\nimport flask\nimport unittest\nfrom flask.testsuite import FlaskTestCase, catch_warnings\n\n\nclass DeprecationsTestCase(FlaskTestCase):\n    \"\"\"not used currently\"\"\"\n\n\ndef suite():\n    suite = unittest.TestSuite()\n    suite.addTest(unittest.makeSuite(DeprecationsTestCase))\n    return suite\n"
  },
  {
    "path": "lib/flask/testsuite/examples.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    flask.testsuite.examples\n    ~~~~~~~~~~~~~~~~~~~~~~~~\n\n    Tests the examples.\n\n    :copyright: (c) 2011 by Armin Ronacher.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nimport os\nimport unittest\nfrom flask.testsuite import add_to_path\n\n\ndef setup_path():\n    example_path = os.path.join(os.path.dirname(__file__),\n                                os.pardir, os.pardir, 'examples')\n    add_to_path(os.path.join(example_path, 'flaskr'))\n    add_to_path(os.path.join(example_path, 'minitwit'))\n\n\ndef suite():\n    setup_path()\n    suite = unittest.TestSuite()\n    try:\n        from minitwit_tests import MiniTwitTestCase\n    except ImportError:\n        pass\n    else:\n        suite.addTest(unittest.makeSuite(MiniTwitTestCase))\n    try:\n        from flaskr_tests import FlaskrTestCase\n    except ImportError:\n        pass\n    else:\n        suite.addTest(unittest.makeSuite(FlaskrTestCase))\n    return suite\n"
  },
  {
    "path": "lib/flask/testsuite/ext.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    flask.testsuite.ext\n    ~~~~~~~~~~~~~~~~~~~\n\n    Tests the extension import thing.\n\n    :copyright: (c) 2011 by Armin Ronacher.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\n\nimport sys\nimport unittest\ntry:\n    from imp import reload as reload_module\nexcept ImportError:\n    reload_module = reload\nfrom flask.testsuite import FlaskTestCase\nfrom flask._compat import PY2\n\nclass ExtImportHookTestCase(FlaskTestCase):\n\n    def setup(self):\n        # we clear this out for various reasons.  The most important one is\n        # that a real flaskext could be in there which would disable our\n        # fake package.  Secondly we want to make sure that the flaskext\n        # import hook does not break on reloading.\n        for entry, value in list(sys.modules.items()):\n            if (entry.startswith('flask.ext.') or\n                entry.startswith('flask_') or\n                entry.startswith('flaskext.') or\n                entry == 'flaskext') and value is not None:\n                sys.modules.pop(entry, None)\n        from flask import ext\n        reload_module(ext)\n\n        # reloading must not add more hooks\n        import_hooks = 0\n        for item in sys.meta_path:\n            cls = type(item)\n            if cls.__module__ == 'flask.exthook' and \\\n               cls.__name__ == 'ExtensionImporter':\n                import_hooks += 1\n        self.assert_equal(import_hooks, 1)\n\n    def teardown(self):\n        from flask import ext\n        for key in ext.__dict__:\n            self.assert_not_in('.', key)\n\n    def test_flaskext_new_simple_import_normal(self):\n        from flask.ext.newext_simple import ext_id\n        self.assert_equal(ext_id, 'newext_simple')\n\n    def test_flaskext_new_simple_import_module(self):\n        from flask.ext import newext_simple\n        self.assert_equal(newext_simple.ext_id, 'newext_simple')\n        self.assert_equal(newext_simple.__name__, 'flask_newext_simple')\n\n    def test_flaskext_new_package_import_normal(self):\n        from flask.ext.newext_package import ext_id\n        self.assert_equal(ext_id, 'newext_package')\n\n    def test_flaskext_new_package_import_module(self):\n        from flask.ext import newext_package\n        self.assert_equal(newext_package.ext_id, 'newext_package')\n        self.assert_equal(newext_package.__name__, 'flask_newext_package')\n\n    def test_flaskext_new_package_import_submodule_function(self):\n        from flask.ext.newext_package.submodule import test_function\n        self.assert_equal(test_function(), 42)\n\n    def test_flaskext_new_package_import_submodule(self):\n        from flask.ext.newext_package import submodule\n        self.assert_equal(submodule.__name__, 'flask_newext_package.submodule')\n        self.assert_equal(submodule.test_function(), 42)\n\n    def test_flaskext_old_simple_import_normal(self):\n        from flask.ext.oldext_simple import ext_id\n        self.assert_equal(ext_id, 'oldext_simple')\n\n    def test_flaskext_old_simple_import_module(self):\n        from flask.ext import oldext_simple\n        self.assert_equal(oldext_simple.ext_id, 'oldext_simple')\n        self.assert_equal(oldext_simple.__name__, 'flaskext.oldext_simple')\n\n    def test_flaskext_old_package_import_normal(self):\n        from flask.ext.oldext_package import ext_id\n        self.assert_equal(ext_id, 'oldext_package')\n\n    def test_flaskext_old_package_import_module(self):\n        from flask.ext import oldext_package\n        self.assert_equal(oldext_package.ext_id, 'oldext_package')\n        self.assert_equal(oldext_package.__name__, 'flaskext.oldext_package')\n\n    def test_flaskext_old_package_import_submodule(self):\n        from flask.ext.oldext_package import submodule\n        self.assert_equal(submodule.__name__, 'flaskext.oldext_package.submodule')\n        self.assert_equal(submodule.test_function(), 42)\n\n    def test_flaskext_old_package_import_submodule_function(self):\n        from flask.ext.oldext_package.submodule import test_function\n        self.assert_equal(test_function(), 42)\n\n    def test_flaskext_broken_package_no_module_caching(self):\n        for x in range(2):\n            with self.assert_raises(ImportError):\n                import flask.ext.broken\n\n    def test_no_error_swallowing(self):\n        try:\n            import flask.ext.broken\n        except ImportError:\n            exc_type, exc_value, tb = sys.exc_info()\n            self.assert_true(exc_type is ImportError)\n            if PY2:\n                message = 'No module named missing_module'\n            else:\n                message = 'No module named \\'missing_module\\''\n            self.assert_equal(str(exc_value), message)\n            self.assert_true(tb.tb_frame.f_globals is globals())\n\n            # reraise() adds a second frame so we need to skip that one too.\n            # On PY3 we even have another one :(\n            next = tb.tb_next.tb_next\n            if not PY2:\n                next = next.tb_next\n            self.assert_in('flask_broken/__init__.py', next.tb_frame.f_code.co_filename)\n\n\ndef suite():\n    suite = unittest.TestSuite()\n    suite.addTest(unittest.makeSuite(ExtImportHookTestCase))\n    return suite\n"
  },
  {
    "path": "lib/flask/testsuite/helpers.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    flask.testsuite.helpers\n    ~~~~~~~~~~~~~~~~~~~~~~~\n\n    Various helpers.\n\n    :copyright: (c) 2011 by Armin Ronacher.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\n\nimport os\nimport flask\nimport unittest\nfrom logging import StreamHandler\nfrom flask.testsuite import FlaskTestCase, catch_warnings, catch_stderr\nfrom werkzeug.http import parse_cache_control_header, parse_options_header\nfrom flask._compat import StringIO, text_type\n\n\ndef has_encoding(name):\n    try:\n        import codecs\n        codecs.lookup(name)\n        return True\n    except LookupError:\n        return False\n\n\nclass JSONTestCase(FlaskTestCase):\n\n    def test_json_bad_requests(self):\n        app = flask.Flask(__name__)\n        @app.route('/json', methods=['POST'])\n        def return_json():\n            return flask.jsonify(foo=text_type(flask.request.get_json()))\n        c = app.test_client()\n        rv = c.post('/json', data='malformed', content_type='application/json')\n        self.assert_equal(rv.status_code, 400)\n\n    def test_json_body_encoding(self):\n        app = flask.Flask(__name__)\n        app.testing = True\n        @app.route('/')\n        def index():\n            return flask.request.get_json()\n\n        c = app.test_client()\n        resp = c.get('/', data=u'\"Hällo Wörld\"'.encode('iso-8859-15'),\n                     content_type='application/json; charset=iso-8859-15')\n        self.assert_equal(resp.data, u'Hällo Wörld'.encode('utf-8'))\n\n    def test_jsonify(self):\n        d = dict(a=23, b=42, c=[1, 2, 3])\n        app = flask.Flask(__name__)\n        @app.route('/kw')\n        def return_kwargs():\n            return flask.jsonify(**d)\n        @app.route('/dict')\n        def return_dict():\n            return flask.jsonify(d)\n        c = app.test_client()\n        for url in '/kw', '/dict':\n            rv = c.get(url)\n            self.assert_equal(rv.mimetype, 'application/json')\n            self.assert_equal(flask.json.loads(rv.data), d)\n\n    def test_json_as_unicode(self):\n        app = flask.Flask(__name__)\n\n        app.config['JSON_AS_ASCII'] = True\n        with app.app_context():\n            rv = flask.json.dumps(u'\\N{SNOWMAN}')\n            self.assert_equal(rv, '\"\\\\u2603\"')\n\n        app.config['JSON_AS_ASCII'] = False\n        with app.app_context():\n            rv = flask.json.dumps(u'\\N{SNOWMAN}')\n            self.assert_equal(rv, u'\"\\u2603\"')\n\n    def test_json_attr(self):\n        app = flask.Flask(__name__)\n        @app.route('/add', methods=['POST'])\n        def add():\n            json = flask.request.get_json()\n            return text_type(json['a'] + json['b'])\n        c = app.test_client()\n        rv = c.post('/add', data=flask.json.dumps({'a': 1, 'b': 2}),\n                            content_type='application/json')\n        self.assert_equal(rv.data, b'3')\n\n    def test_template_escaping(self):\n        app = flask.Flask(__name__)\n        render = flask.render_template_string\n        with app.test_request_context():\n            rv = flask.json.htmlsafe_dumps('</script>')\n            self.assert_equal(rv, u'\"\\\\u003c/script\\\\u003e\"')\n            self.assert_equal(type(rv), text_type)\n            rv = render('{{ \"</script>\"|tojson }}')\n            self.assert_equal(rv, '\"\\\\u003c/script\\\\u003e\"')\n            rv = render('{{ \"<\\0/script>\"|tojson }}')\n            self.assert_equal(rv, '\"\\\\u003c\\\\u0000/script\\\\u003e\"')\n            rv = render('{{ \"<!--<script>\"|tojson }}')\n            self.assert_equal(rv, '\"\\\\u003c!--\\\\u003cscript\\\\u003e\"')\n            rv = render('{{ \"&\"|tojson }}')\n            self.assert_equal(rv, '\"\\\\u0026\"')\n\n    def test_json_customization(self):\n        class X(object):\n            def __init__(self, val):\n                self.val = val\n        class MyEncoder(flask.json.JSONEncoder):\n            def default(self, o):\n                if isinstance(o, X):\n                    return '<%d>' % o.val\n                return flask.json.JSONEncoder.default(self, o)\n        class MyDecoder(flask.json.JSONDecoder):\n            def __init__(self, *args, **kwargs):\n                kwargs.setdefault('object_hook', self.object_hook)\n                flask.json.JSONDecoder.__init__(self, *args, **kwargs)\n            def object_hook(self, obj):\n                if len(obj) == 1 and '_foo' in obj:\n                    return X(obj['_foo'])\n                return obj\n        app = flask.Flask(__name__)\n        app.testing = True\n        app.json_encoder = MyEncoder\n        app.json_decoder = MyDecoder\n        @app.route('/', methods=['POST'])\n        def index():\n            return flask.json.dumps(flask.request.get_json()['x'])\n        c = app.test_client()\n        rv = c.post('/', data=flask.json.dumps({\n            'x': {'_foo': 42}\n        }), content_type='application/json')\n        self.assertEqual(rv.data, b'\"<42>\"')\n\n    def test_modified_url_encoding(self):\n        class ModifiedRequest(flask.Request):\n            url_charset = 'euc-kr'\n        app = flask.Flask(__name__)\n        app.testing = True\n        app.request_class = ModifiedRequest\n        app.url_map.charset = 'euc-kr'\n\n        @app.route('/')\n        def index():\n            return flask.request.args['foo']\n\n        rv = app.test_client().get(u'/?foo=정상처리'.encode('euc-kr'))\n        self.assert_equal(rv.status_code, 200)\n        self.assert_equal(rv.data, u'정상처리'.encode('utf-8'))\n\n    if not has_encoding('euc-kr'):\n        test_modified_url_encoding = None\n\n    def test_json_key_sorting(self):\n        app = flask.Flask(__name__)\n        app.testing = True\n        self.assert_equal(app.config['JSON_SORT_KEYS'], True)\n        d = dict.fromkeys(range(20), 'foo')\n\n        @app.route('/')\n        def index():\n            return flask.jsonify(values=d)\n\n        c = app.test_client()\n        rv = c.get('/')\n        lines = [x.strip() for x in rv.data.strip().decode('utf-8').splitlines()]\n        self.assert_equal(lines, [\n            '{',\n            '\"values\": {',\n            '\"0\": \"foo\",',\n            '\"1\": \"foo\",',\n            '\"2\": \"foo\",',\n            '\"3\": \"foo\",',\n            '\"4\": \"foo\",',\n            '\"5\": \"foo\",',\n            '\"6\": \"foo\",',\n            '\"7\": \"foo\",',\n            '\"8\": \"foo\",',\n            '\"9\": \"foo\",',\n            '\"10\": \"foo\",',\n            '\"11\": \"foo\",',\n            '\"12\": \"foo\",',\n            '\"13\": \"foo\",',\n            '\"14\": \"foo\",',\n            '\"15\": \"foo\",',\n            '\"16\": \"foo\",',\n            '\"17\": \"foo\",',\n            '\"18\": \"foo\",',\n            '\"19\": \"foo\"',\n            '}',\n            '}'\n        ])\n\n\nclass SendfileTestCase(FlaskTestCase):\n\n    def test_send_file_regular(self):\n        app = flask.Flask(__name__)\n        with app.test_request_context():\n            rv = flask.send_file('static/index.html')\n            self.assert_true(rv.direct_passthrough)\n            self.assert_equal(rv.mimetype, 'text/html')\n            with app.open_resource('static/index.html') as f:\n                rv.direct_passthrough = False\n                self.assert_equal(rv.data, f.read())\n            rv.close()\n\n    def test_send_file_xsendfile(self):\n        app = flask.Flask(__name__)\n        app.use_x_sendfile = True\n        with app.test_request_context():\n            rv = flask.send_file('static/index.html')\n            self.assert_true(rv.direct_passthrough)\n            self.assert_in('x-sendfile', rv.headers)\n            self.assert_equal(rv.headers['x-sendfile'],\n                os.path.join(app.root_path, 'static/index.html'))\n            self.assert_equal(rv.mimetype, 'text/html')\n            rv.close()\n\n    def test_send_file_object(self):\n        app = flask.Flask(__name__)\n        with catch_warnings() as captured:\n            with app.test_request_context():\n                f = open(os.path.join(app.root_path, 'static/index.html'))\n                rv = flask.send_file(f)\n                rv.direct_passthrough = False\n                with app.open_resource('static/index.html') as f:\n                    self.assert_equal(rv.data, f.read())\n                self.assert_equal(rv.mimetype, 'text/html')\n                rv.close()\n            # mimetypes + etag\n            self.assert_equal(len(captured), 2)\n\n        app.use_x_sendfile = True\n        with catch_warnings() as captured:\n            with app.test_request_context():\n                f = open(os.path.join(app.root_path, 'static/index.html'))\n                rv = flask.send_file(f)\n                self.assert_equal(rv.mimetype, 'text/html')\n                self.assert_in('x-sendfile', rv.headers)\n                self.assert_equal(rv.headers['x-sendfile'],\n                    os.path.join(app.root_path, 'static/index.html'))\n                rv.close()\n            # mimetypes + etag\n            self.assert_equal(len(captured), 2)\n\n        app.use_x_sendfile = False\n        with app.test_request_context():\n            with catch_warnings() as captured:\n                f = StringIO('Test')\n                rv = flask.send_file(f)\n                rv.direct_passthrough = False\n                self.assert_equal(rv.data, b'Test')\n                self.assert_equal(rv.mimetype, 'application/octet-stream')\n                rv.close()\n            # etags\n            self.assert_equal(len(captured), 1)\n            with catch_warnings() as captured:\n                f = StringIO('Test')\n                rv = flask.send_file(f, mimetype='text/plain')\n                rv.direct_passthrough = False\n                self.assert_equal(rv.data, b'Test')\n                self.assert_equal(rv.mimetype, 'text/plain')\n                rv.close()\n            # etags\n            self.assert_equal(len(captured), 1)\n\n        app.use_x_sendfile = True\n        with catch_warnings() as captured:\n            with app.test_request_context():\n                f = StringIO('Test')\n                rv = flask.send_file(f)\n                self.assert_not_in('x-sendfile', rv.headers)\n                rv.close()\n            # etags\n            self.assert_equal(len(captured), 1)\n\n    def test_attachment(self):\n        app = flask.Flask(__name__)\n        with catch_warnings() as captured:\n            with app.test_request_context():\n                f = open(os.path.join(app.root_path, 'static/index.html'))\n                rv = flask.send_file(f, as_attachment=True)\n                value, options = parse_options_header(rv.headers['Content-Disposition'])\n                self.assert_equal(value, 'attachment')\n                rv.close()\n            # mimetypes + etag\n            self.assert_equal(len(captured), 2)\n\n        with app.test_request_context():\n            self.assert_equal(options['filename'], 'index.html')\n            rv = flask.send_file('static/index.html', as_attachment=True)\n            value, options = parse_options_header(rv.headers['Content-Disposition'])\n            self.assert_equal(value, 'attachment')\n            self.assert_equal(options['filename'], 'index.html')\n            rv.close()\n\n        with app.test_request_context():\n            rv = flask.send_file(StringIO('Test'), as_attachment=True,\n                                 attachment_filename='index.txt',\n                                 add_etags=False)\n            self.assert_equal(rv.mimetype, 'text/plain')\n            value, options = parse_options_header(rv.headers['Content-Disposition'])\n            self.assert_equal(value, 'attachment')\n            self.assert_equal(options['filename'], 'index.txt')\n            rv.close()\n\n    def test_static_file(self):\n        app = flask.Flask(__name__)\n        # default cache timeout is 12 hours\n        with app.test_request_context():\n            # Test with static file handler.\n            rv = app.send_static_file('index.html')\n            cc = parse_cache_control_header(rv.headers['Cache-Control'])\n            self.assert_equal(cc.max_age, 12 * 60 * 60)\n            rv.close()\n            # Test again with direct use of send_file utility.\n            rv = flask.send_file('static/index.html')\n            cc = parse_cache_control_header(rv.headers['Cache-Control'])\n            self.assert_equal(cc.max_age, 12 * 60 * 60)\n            rv.close()\n        app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 3600\n        with app.test_request_context():\n            # Test with static file handler.\n            rv = app.send_static_file('index.html')\n            cc = parse_cache_control_header(rv.headers['Cache-Control'])\n            self.assert_equal(cc.max_age, 3600)\n            rv.close()\n            # Test again with direct use of send_file utility.\n            rv = flask.send_file('static/index.html')\n            cc = parse_cache_control_header(rv.headers['Cache-Control'])\n            self.assert_equal(cc.max_age, 3600)\n            rv.close()\n        class StaticFileApp(flask.Flask):\n            def get_send_file_max_age(self, filename):\n                return 10\n        app = StaticFileApp(__name__)\n        with app.test_request_context():\n            # Test with static file handler.\n            rv = app.send_static_file('index.html')\n            cc = parse_cache_control_header(rv.headers['Cache-Control'])\n            self.assert_equal(cc.max_age, 10)\n            rv.close()\n            # Test again with direct use of send_file utility.\n            rv = flask.send_file('static/index.html')\n            cc = parse_cache_control_header(rv.headers['Cache-Control'])\n            self.assert_equal(cc.max_age, 10)\n            rv.close()\n\n\nclass LoggingTestCase(FlaskTestCase):\n\n    def test_logger_cache(self):\n        app = flask.Flask(__name__)\n        logger1 = app.logger\n        self.assert_true(app.logger is logger1)\n        self.assert_equal(logger1.name, __name__)\n        app.logger_name = __name__ + '/test_logger_cache'\n        self.assert_true(app.logger is not logger1)\n\n    def test_debug_log(self):\n        app = flask.Flask(__name__)\n        app.debug = True\n\n        @app.route('/')\n        def index():\n            app.logger.warning('the standard library is dead')\n            app.logger.debug('this is a debug statement')\n            return ''\n\n        @app.route('/exc')\n        def exc():\n            1 // 0\n\n        with app.test_client() as c:\n            with catch_stderr() as err:\n                c.get('/')\n                out = err.getvalue()\n                self.assert_in('WARNING in helpers [', out)\n                self.assert_in(os.path.basename(__file__.rsplit('.', 1)[0] + '.py'), out)\n                self.assert_in('the standard library is dead', out)\n                self.assert_in('this is a debug statement', out)\n\n            with catch_stderr() as err:\n                try:\n                    c.get('/exc')\n                except ZeroDivisionError:\n                    pass\n                else:\n                    self.assert_true(False, 'debug log ate the exception')\n\n    def test_debug_log_override(self):\n        app = flask.Flask(__name__)\n        app.debug = True\n        app.logger_name = 'flask_tests/test_debug_log_override'\n        app.logger.level = 10\n        self.assert_equal(app.logger.level, 10)\n\n    def test_exception_logging(self):\n        out = StringIO()\n        app = flask.Flask(__name__)\n        app.logger_name = 'flask_tests/test_exception_logging'\n        app.logger.addHandler(StreamHandler(out))\n\n        @app.route('/')\n        def index():\n            1 // 0\n\n        rv = app.test_client().get('/')\n        self.assert_equal(rv.status_code, 500)\n        self.assert_in(b'Internal Server Error', rv.data)\n\n        err = out.getvalue()\n        self.assert_in('Exception on / [GET]', err)\n        self.assert_in('Traceback (most recent call last):', err)\n        self.assert_in('1 // 0', err)\n        self.assert_in('ZeroDivisionError:', err)\n\n    def test_processor_exceptions(self):\n        app = flask.Flask(__name__)\n        @app.before_request\n        def before_request():\n            if trigger == 'before':\n                1 // 0\n        @app.after_request\n        def after_request(response):\n            if trigger == 'after':\n                1 // 0\n            return response\n        @app.route('/')\n        def index():\n            return 'Foo'\n        @app.errorhandler(500)\n        def internal_server_error(e):\n            return 'Hello Server Error', 500\n        for trigger in 'before', 'after':\n            rv = app.test_client().get('/')\n            self.assert_equal(rv.status_code, 500)\n            self.assert_equal(rv.data, b'Hello Server Error')\n\n    def test_url_for_with_anchor(self):\n        app = flask.Flask(__name__)\n        @app.route('/')\n        def index():\n            return '42'\n        with app.test_request_context():\n            self.assert_equal(flask.url_for('index', _anchor='x y'),\n                              '/#x%20y')\n\n    def test_url_for_with_scheme(self):\n        app = flask.Flask(__name__)\n        @app.route('/')\n        def index():\n            return '42'\n        with app.test_request_context():\n            self.assert_equal(flask.url_for('index',\n                                            _external=True,\n                                            _scheme='https'),\n                              'https://localhost/')\n\n    def test_url_for_with_scheme_not_external(self):\n        app = flask.Flask(__name__)\n        @app.route('/')\n        def index():\n            return '42'\n        with app.test_request_context():\n            self.assert_raises(ValueError,\n                               flask.url_for,\n                               'index',\n                               _scheme='https')\n\n    def test_url_with_method(self):\n        from flask.views import MethodView\n        app = flask.Flask(__name__)\n        class MyView(MethodView):\n            def get(self, id=None):\n                if id is None:\n                    return 'List'\n                return 'Get %d' % id\n            def post(self):\n                return 'Create'\n        myview = MyView.as_view('myview')\n        app.add_url_rule('/myview/', methods=['GET'],\n                         view_func=myview)\n        app.add_url_rule('/myview/<int:id>', methods=['GET'],\n                         view_func=myview)\n        app.add_url_rule('/myview/create', methods=['POST'],\n                         view_func=myview)\n\n        with app.test_request_context():\n            self.assert_equal(flask.url_for('myview', _method='GET'),\n                              '/myview/')\n            self.assert_equal(flask.url_for('myview', id=42, _method='GET'),\n                              '/myview/42')\n            self.assert_equal(flask.url_for('myview', _method='POST'),\n                              '/myview/create')\n\n\nclass NoImportsTestCase(FlaskTestCase):\n    \"\"\"Test Flasks are created without import.\n\n    Avoiding ``__import__`` helps create Flask instances where there are errors\n    at import time.  Those runtime errors will be apparent to the user soon\n    enough, but tools which build Flask instances meta-programmatically benefit\n    from a Flask which does not ``__import__``.  Instead of importing to\n    retrieve file paths or metadata on a module or package, use the pkgutil and\n    imp modules in the Python standard library.\n    \"\"\"\n\n    def test_name_with_import_error(self):\n        try:\n            flask.Flask('importerror')\n        except NotImplementedError:\n            self.fail('Flask(import_name) is importing import_name.')\n\n\nclass StreamingTestCase(FlaskTestCase):\n\n    def test_streaming_with_context(self):\n        app = flask.Flask(__name__)\n        app.testing = True\n        @app.route('/')\n        def index():\n            def generate():\n                yield 'Hello '\n                yield flask.request.args['name']\n                yield '!'\n            return flask.Response(flask.stream_with_context(generate()))\n        c = app.test_client()\n        rv = c.get('/?name=World')\n        self.assertEqual(rv.data, b'Hello World!')\n\n    def test_streaming_with_context_as_decorator(self):\n        app = flask.Flask(__name__)\n        app.testing = True\n        @app.route('/')\n        def index():\n            @flask.stream_with_context\n            def generate():\n                yield 'Hello '\n                yield flask.request.args['name']\n                yield '!'\n            return flask.Response(generate())\n        c = app.test_client()\n        rv = c.get('/?name=World')\n        self.assertEqual(rv.data, b'Hello World!')\n\n    def test_streaming_with_context_and_custom_close(self):\n        app = flask.Flask(__name__)\n        app.testing = True\n        called = []\n        class Wrapper(object):\n            def __init__(self, gen):\n                self._gen = gen\n            def __iter__(self):\n                return self\n            def close(self):\n                called.append(42)\n            def __next__(self):\n                return next(self._gen)\n            next = __next__\n        @app.route('/')\n        def index():\n            def generate():\n                yield 'Hello '\n                yield flask.request.args['name']\n                yield '!'\n            return flask.Response(flask.stream_with_context(\n                Wrapper(generate())))\n        c = app.test_client()\n        rv = c.get('/?name=World')\n        self.assertEqual(rv.data, b'Hello World!')\n        self.assertEqual(called, [42])\n\n\ndef suite():\n    suite = unittest.TestSuite()\n    if flask.json_available:\n        suite.addTest(unittest.makeSuite(JSONTestCase))\n    suite.addTest(unittest.makeSuite(SendfileTestCase))\n    suite.addTest(unittest.makeSuite(LoggingTestCase))\n    suite.addTest(unittest.makeSuite(NoImportsTestCase))\n    suite.addTest(unittest.makeSuite(StreamingTestCase))\n    return suite\n"
  },
  {
    "path": "lib/flask/testsuite/regression.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    flask.testsuite.regression\n    ~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n    Tests regressions.\n\n    :copyright: (c) 2011 by Armin Ronacher.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\n\nimport os\nimport gc\nimport sys\nimport flask\nimport threading\nimport unittest\nfrom werkzeug.exceptions import NotFound\nfrom flask.testsuite import FlaskTestCase\n\n\n_gc_lock = threading.Lock()\n\n\nclass _NoLeakAsserter(object):\n\n    def __init__(self, testcase):\n        self.testcase = testcase\n\n    def __enter__(self):\n        gc.disable()\n        _gc_lock.acquire()\n        loc = flask._request_ctx_stack._local\n\n        # Force Python to track this dictionary at all times.\n        # This is necessary since Python only starts tracking\n        # dicts if they contain mutable objects.  It's a horrible,\n        # horrible hack but makes this kinda testable.\n        loc.__storage__['FOOO'] = [1, 2, 3]\n\n        gc.collect()\n        self.old_objects = len(gc.get_objects())\n\n    def __exit__(self, exc_type, exc_value, tb):\n        if not hasattr(sys, 'getrefcount'):\n            gc.collect()\n        new_objects = len(gc.get_objects())\n        if new_objects > self.old_objects:\n            self.testcase.fail('Example code leaked')\n        _gc_lock.release()\n        gc.enable()\n\n\nclass MemoryTestCase(FlaskTestCase):\n\n    def assert_no_leak(self):\n        return _NoLeakAsserter(self)\n\n    def test_memory_consumption(self):\n        app = flask.Flask(__name__)\n        @app.route('/')\n        def index():\n            return flask.render_template('simple_template.html', whiskey=42)\n\n        def fire():\n            with app.test_client() as c:\n                rv = c.get('/')\n                self.assert_equal(rv.status_code, 200)\n                self.assert_equal(rv.data, b'<h1>42</h1>')\n\n        # Trigger caches\n        fire()\n\n        # This test only works on CPython 2.7.\n        if sys.version_info >= (2, 7) and \\\n                not hasattr(sys, 'pypy_translation_info'):\n            with self.assert_no_leak():\n                for x in range(10):\n                    fire()\n\n    def test_safe_join_toplevel_pardir(self):\n        from flask.helpers import safe_join\n        with self.assert_raises(NotFound):\n            safe_join('/foo', '..')\n\n\nclass ExceptionTestCase(FlaskTestCase):\n\n    def test_aborting(self):\n        class Foo(Exception):\n            whatever = 42\n        app = flask.Flask(__name__)\n        app.testing = True\n        @app.errorhandler(Foo)\n        def handle_foo(e):\n            return str(e.whatever)\n        @app.route('/')\n        def index():\n            raise flask.abort(flask.redirect(flask.url_for('test')))\n        @app.route('/test')\n        def test():\n            raise Foo()\n\n        with app.test_client() as c:\n            rv = c.get('/')\n            self.assertEqual(rv.headers['Location'], 'http://localhost/test')\n            rv = c.get('/test')\n            self.assertEqual(rv.data, b'42')\n\n\ndef suite():\n    suite = unittest.TestSuite()\n    if os.environ.get('RUN_FLASK_MEMORY_TESTS') == '1':\n        suite.addTest(unittest.makeSuite(MemoryTestCase))\n    suite.addTest(unittest.makeSuite(ExceptionTestCase))\n    return suite\n"
  },
  {
    "path": "lib/flask/testsuite/reqctx.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    flask.testsuite.reqctx\n    ~~~~~~~~~~~~~~~~~~~~~~\n\n    Tests the request context.\n\n    :copyright: (c) 2012 by Armin Ronacher.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\n\nimport flask\nimport unittest\ntry:\n    from greenlet import greenlet\nexcept ImportError:\n    greenlet = None\nfrom flask.testsuite import FlaskTestCase\n\n\nclass RequestContextTestCase(FlaskTestCase):\n\n    def test_teardown_on_pop(self):\n        buffer = []\n        app = flask.Flask(__name__)\n        @app.teardown_request\n        def end_of_request(exception):\n            buffer.append(exception)\n\n        ctx = app.test_request_context()\n        ctx.push()\n        self.assert_equal(buffer, [])\n        ctx.pop()\n        self.assert_equal(buffer, [None])\n\n    def test_proper_test_request_context(self):\n        app = flask.Flask(__name__)\n        app.config.update(\n            SERVER_NAME='localhost.localdomain:5000'\n        )\n\n        @app.route('/')\n        def index():\n            return None\n\n        @app.route('/', subdomain='foo')\n        def sub():\n            return None\n\n        with app.test_request_context('/'):\n            self.assert_equal(flask.url_for('index', _external=True), 'http://localhost.localdomain:5000/')\n\n        with app.test_request_context('/'):\n            self.assert_equal(flask.url_for('sub', _external=True), 'http://foo.localhost.localdomain:5000/')\n\n        try:\n            with app.test_request_context('/', environ_overrides={'HTTP_HOST': 'localhost'}):\n                pass\n        except Exception as e:\n            self.assert_true(isinstance(e, ValueError))\n            self.assert_equal(str(e), \"the server name provided \" +\n                    \"('localhost.localdomain:5000') does not match the \" + \\\n                    \"server name from the WSGI environment ('localhost')\")\n\n        try:\n            app.config.update(SERVER_NAME='localhost')\n            with app.test_request_context('/', environ_overrides={'SERVER_NAME': 'localhost'}):\n                pass\n        except ValueError as e:\n            raise ValueError(\n                \"No ValueError exception should have been raised \\\"%s\\\"\" % e\n            )\n\n        try:\n            app.config.update(SERVER_NAME='localhost:80')\n            with app.test_request_context('/', environ_overrides={'SERVER_NAME': 'localhost:80'}):\n                pass\n        except ValueError as e:\n            raise ValueError(\n                \"No ValueError exception should have been raised \\\"%s\\\"\" % e\n            )\n\n    def test_context_binding(self):\n        app = flask.Flask(__name__)\n        @app.route('/')\n        def index():\n            return 'Hello %s!' % flask.request.args['name']\n        @app.route('/meh')\n        def meh():\n            return flask.request.url\n\n        with app.test_request_context('/?name=World'):\n            self.assert_equal(index(), 'Hello World!')\n        with app.test_request_context('/meh'):\n            self.assert_equal(meh(), 'http://localhost/meh')\n        self.assert_true(flask._request_ctx_stack.top is None)\n\n    def test_context_test(self):\n        app = flask.Flask(__name__)\n        self.assert_false(flask.request)\n        self.assert_false(flask.has_request_context())\n        ctx = app.test_request_context()\n        ctx.push()\n        try:\n            self.assert_true(flask.request)\n            self.assert_true(flask.has_request_context())\n        finally:\n            ctx.pop()\n\n    def test_manual_context_binding(self):\n        app = flask.Flask(__name__)\n        @app.route('/')\n        def index():\n            return 'Hello %s!' % flask.request.args['name']\n\n        ctx = app.test_request_context('/?name=World')\n        ctx.push()\n        self.assert_equal(index(), 'Hello World!')\n        ctx.pop()\n        try:\n            index()\n        except RuntimeError:\n            pass\n        else:\n            self.assert_true(0, 'expected runtime error')\n\n    def test_greenlet_context_copying(self):\n        app = flask.Flask(__name__)\n        greenlets = []\n\n        @app.route('/')\n        def index():\n            reqctx = flask._request_ctx_stack.top.copy()\n            def g():\n                self.assert_false(flask.request)\n                self.assert_false(flask.current_app)\n                with reqctx:\n                    self.assert_true(flask.request)\n                    self.assert_equal(flask.current_app, app)\n                    self.assert_equal(flask.request.path, '/')\n                    self.assert_equal(flask.request.args['foo'], 'bar')\n                self.assert_false(flask.request)\n                return 42\n            greenlets.append(greenlet(g))\n            return 'Hello World!'\n\n        rv = app.test_client().get('/?foo=bar')\n        self.assert_equal(rv.data, b'Hello World!')\n\n        result = greenlets[0].run()\n        self.assert_equal(result, 42)\n\n    def test_greenlet_context_copying_api(self):\n        app = flask.Flask(__name__)\n        greenlets = []\n\n        @app.route('/')\n        def index():\n            reqctx = flask._request_ctx_stack.top.copy()\n            @flask.copy_current_request_context\n            def g():\n                self.assert_true(flask.request)\n                self.assert_equal(flask.current_app, app)\n                self.assert_equal(flask.request.path, '/')\n                self.assert_equal(flask.request.args['foo'], 'bar')\n                return 42\n            greenlets.append(greenlet(g))\n            return 'Hello World!'\n\n        rv = app.test_client().get('/?foo=bar')\n        self.assert_equal(rv.data, b'Hello World!')\n\n        result = greenlets[0].run()\n        self.assert_equal(result, 42)\n\n    # Disable test if we don't have greenlets available\n    if greenlet is None:\n        test_greenlet_context_copying = None\n        test_greenlet_context_copying_api = None\n\n\ndef suite():\n    suite = unittest.TestSuite()\n    suite.addTest(unittest.makeSuite(RequestContextTestCase))\n    return suite\n"
  },
  {
    "path": "lib/flask/testsuite/signals.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    flask.testsuite.signals\n    ~~~~~~~~~~~~~~~~~~~~~~~\n\n    Signalling.\n\n    :copyright: (c) 2011 by Armin Ronacher.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\n\nimport flask\nimport unittest\nfrom flask.testsuite import FlaskTestCase\n\n\nclass SignalsTestCase(FlaskTestCase):\n\n    def test_template_rendered(self):\n        app = flask.Flask(__name__)\n\n        @app.route('/')\n        def index():\n            return flask.render_template('simple_template.html', whiskey=42)\n\n        recorded = []\n        def record(sender, template, context):\n            recorded.append((template, context))\n\n        flask.template_rendered.connect(record, app)\n        try:\n            app.test_client().get('/')\n            self.assert_equal(len(recorded), 1)\n            template, context = recorded[0]\n            self.assert_equal(template.name, 'simple_template.html')\n            self.assert_equal(context['whiskey'], 42)\n        finally:\n            flask.template_rendered.disconnect(record, app)\n\n    def test_request_signals(self):\n        app = flask.Flask(__name__)\n        calls = []\n\n        def before_request_signal(sender):\n            calls.append('before-signal')\n\n        def after_request_signal(sender, response):\n            self.assert_equal(response.data, b'stuff')\n            calls.append('after-signal')\n\n        @app.before_request\n        def before_request_handler():\n            calls.append('before-handler')\n\n        @app.after_request\n        def after_request_handler(response):\n            calls.append('after-handler')\n            response.data = 'stuff'\n            return response\n\n        @app.route('/')\n        def index():\n            calls.append('handler')\n            return 'ignored anyway'\n\n        flask.request_started.connect(before_request_signal, app)\n        flask.request_finished.connect(after_request_signal, app)\n\n        try:\n            rv = app.test_client().get('/')\n            self.assert_equal(rv.data, b'stuff')\n\n            self.assert_equal(calls, ['before-signal', 'before-handler',\n                             'handler', 'after-handler',\n                             'after-signal'])\n        finally:\n            flask.request_started.disconnect(before_request_signal, app)\n            flask.request_finished.disconnect(after_request_signal, app)\n\n    def test_request_exception_signal(self):\n        app = flask.Flask(__name__)\n        recorded = []\n\n        @app.route('/')\n        def index():\n            1 // 0\n\n        def record(sender, exception):\n            recorded.append(exception)\n\n        flask.got_request_exception.connect(record, app)\n        try:\n            self.assert_equal(app.test_client().get('/').status_code, 500)\n            self.assert_equal(len(recorded), 1)\n            self.assert_true(isinstance(recorded[0], ZeroDivisionError))\n        finally:\n            flask.got_request_exception.disconnect(record, app)\n\n    def test_appcontext_signals(self):\n        app = flask.Flask(__name__)\n        recorded = []\n        def record_push(sender, **kwargs):\n            recorded.append('push')\n        def record_pop(sender, **kwargs):\n            recorded.append('push')\n\n        @app.route('/')\n        def index():\n            return 'Hello'\n\n        flask.appcontext_pushed.connect(record_push, app)\n        flask.appcontext_popped.connect(record_pop, app)\n        try:\n            with app.test_client() as c:\n                rv = c.get('/')\n                self.assert_equal(rv.data, b'Hello')\n                self.assert_equal(recorded, ['push'])\n            self.assert_equal(recorded, ['push', 'pop'])\n        finally:\n            flask.appcontext_pushed.disconnect(record_push, app)\n            flask.appcontext_popped.disconnect(record_pop, app)\n\n    def test_flash_signal(self):\n        app = flask.Flask(__name__)\n        app.config['SECRET_KEY'] = 'secret'\n\n        @app.route('/')\n        def index():\n            flask.flash('This is a flash message', category='notice')\n            return flask.redirect('/other')\n\n        recorded = []\n        def record(sender, message, category):\n            recorded.append((message, category))\n\n        flask.message_flashed.connect(record, app)\n        try:\n            client = app.test_client()\n            with client.session_transaction():\n                client.get('/')\n                self.assert_equal(len(recorded), 1)\n                message, category = recorded[0]\n                self.assert_equal(message, 'This is a flash message')\n                self.assert_equal(category, 'notice')\n        finally:\n            flask.message_flashed.disconnect(record, app)\n\n\ndef suite():\n    suite = unittest.TestSuite()\n    if flask.signals_available:\n        suite.addTest(unittest.makeSuite(SignalsTestCase))\n    return suite\n"
  },
  {
    "path": "lib/flask/testsuite/static/index.html",
    "content": "<h1>Hello World!</h1>\n"
  },
  {
    "path": "lib/flask/testsuite/subclassing.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    flask.testsuite.subclassing\n    ~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n    Test that certain behavior of flask can be customized by\n    subclasses.\n\n    :copyright: (c) 2011 by Armin Ronacher.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nimport flask\nimport unittest\nfrom logging import StreamHandler\nfrom flask.testsuite import FlaskTestCase\nfrom flask._compat import StringIO\n\n\nclass FlaskSubclassingTestCase(FlaskTestCase):\n\n    def test_suppressed_exception_logging(self):\n        class SuppressedFlask(flask.Flask):\n            def log_exception(self, exc_info):\n                pass\n\n        out = StringIO()\n        app = SuppressedFlask(__name__)\n        app.logger_name = 'flask_tests/test_suppressed_exception_logging'\n        app.logger.addHandler(StreamHandler(out))\n\n        @app.route('/')\n        def index():\n            1 // 0\n\n        rv = app.test_client().get('/')\n        self.assert_equal(rv.status_code, 500)\n        self.assert_in(b'Internal Server Error', rv.data)\n\n        err = out.getvalue()\n        self.assert_equal(err, '')\n\n\ndef suite():\n    suite = unittest.TestSuite()\n    suite.addTest(unittest.makeSuite(FlaskSubclassingTestCase))\n    return suite\n"
  },
  {
    "path": "lib/flask/testsuite/templates/_macro.html",
    "content": "{% macro hello(name) %}Hello {{ name }}!{% endmacro %}\n"
  },
  {
    "path": "lib/flask/testsuite/templates/context_template.html",
    "content": "<p>{{ value }}|{{ injected_value }}\n"
  },
  {
    "path": "lib/flask/testsuite/templates/escaping_template.html",
    "content": "{{ text }}\n{{ html }}\n{% autoescape false %}{{ text }}\n{{ html }}{% endautoescape %}\n{% autoescape true %}{{ text }}\n{{ html }}{% endautoescape %}\n"
  },
  {
    "path": "lib/flask/testsuite/templates/mail.txt",
    "content": "{{ foo}} Mail\n"
  },
  {
    "path": "lib/flask/testsuite/templates/nested/nested.txt",
    "content": "I'm nested\n"
  },
  {
    "path": "lib/flask/testsuite/templates/simple_template.html",
    "content": "<h1>{{ whiskey }}</h1>\n"
  },
  {
    "path": "lib/flask/testsuite/templates/template_filter.html",
    "content": "{{ value|super_reverse }}"
  },
  {
    "path": "lib/flask/testsuite/templates/template_test.html",
    "content": "{% if value is boolean %}\n    Success!\n{% endif %}\n"
  },
  {
    "path": "lib/flask/testsuite/templating.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    flask.testsuite.templating\n    ~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n    Template functionality\n\n    :copyright: (c) 2011 by Armin Ronacher.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\n\nimport flask\nimport unittest\nfrom flask.testsuite import FlaskTestCase\n\n\nclass TemplatingTestCase(FlaskTestCase):\n\n    def test_context_processing(self):\n        app = flask.Flask(__name__)\n        @app.context_processor\n        def context_processor():\n            return {'injected_value': 42}\n        @app.route('/')\n        def index():\n            return flask.render_template('context_template.html', value=23)\n        rv = app.test_client().get('/')\n        self.assert_equal(rv.data, b'<p>23|42')\n\n    def test_original_win(self):\n        app = flask.Flask(__name__)\n        @app.route('/')\n        def index():\n            return flask.render_template_string('{{ config }}', config=42)\n        rv = app.test_client().get('/')\n        self.assert_equal(rv.data, b'42')\n\n    def test_request_less_rendering(self):\n        app = flask.Flask(__name__)\n        app.config['WORLD_NAME'] = 'Special World'\n        @app.context_processor\n        def context_processor():\n            return dict(foo=42)\n\n        with app.app_context():\n            rv = flask.render_template_string('Hello {{ config.WORLD_NAME }} '\n                                              '{{ foo }}')\n            self.assert_equal(rv, 'Hello Special World 42')\n\n    def test_standard_context(self):\n        app = flask.Flask(__name__)\n        app.secret_key = 'development key'\n        @app.route('/')\n        def index():\n            flask.g.foo = 23\n            flask.session['test'] = 'aha'\n            return flask.render_template_string('''\n                {{ request.args.foo }}\n                {{ g.foo }}\n                {{ config.DEBUG }}\n                {{ session.test }}\n            ''')\n        rv = app.test_client().get('/?foo=42')\n        self.assert_equal(rv.data.split(), [b'42', b'23', b'False', b'aha'])\n\n    def test_escaping(self):\n        text = '<p>Hello World!'\n        app = flask.Flask(__name__)\n        @app.route('/')\n        def index():\n            return flask.render_template('escaping_template.html', text=text,\n                                         html=flask.Markup(text))\n        lines = app.test_client().get('/').data.splitlines()\n        self.assert_equal(lines, [\n            b'&lt;p&gt;Hello World!',\n            b'<p>Hello World!',\n            b'<p>Hello World!',\n            b'<p>Hello World!',\n            b'&lt;p&gt;Hello World!',\n            b'<p>Hello World!'\n        ])\n\n    def test_no_escaping(self):\n        app = flask.Flask(__name__)\n        with app.test_request_context():\n            self.assert_equal(flask.render_template_string('{{ foo }}',\n                              foo='<test>'), '<test>')\n            self.assert_equal(flask.render_template('mail.txt', foo='<test>'),\n                              '<test> Mail')\n\n    def test_macros(self):\n        app = flask.Flask(__name__)\n        with app.test_request_context():\n            macro = flask.get_template_attribute('_macro.html', 'hello')\n            self.assert_equal(macro('World'), 'Hello World!')\n\n    def test_template_filter(self):\n        app = flask.Flask(__name__)\n        @app.template_filter()\n        def my_reverse(s):\n            return s[::-1]\n        self.assert_in('my_reverse', app.jinja_env.filters.keys())\n        self.assert_equal(app.jinja_env.filters['my_reverse'], my_reverse)\n        self.assert_equal(app.jinja_env.filters['my_reverse']('abcd'), 'dcba')\n\n    def test_add_template_filter(self):\n        app = flask.Flask(__name__)\n        def my_reverse(s):\n            return s[::-1]\n        app.add_template_filter(my_reverse)\n        self.assert_in('my_reverse', app.jinja_env.filters.keys())\n        self.assert_equal(app.jinja_env.filters['my_reverse'], my_reverse)\n        self.assert_equal(app.jinja_env.filters['my_reverse']('abcd'), 'dcba')\n\n    def test_template_filter_with_name(self):\n        app = flask.Flask(__name__)\n        @app.template_filter('strrev')\n        def my_reverse(s):\n            return s[::-1]\n        self.assert_in('strrev', app.jinja_env.filters.keys())\n        self.assert_equal(app.jinja_env.filters['strrev'], my_reverse)\n        self.assert_equal(app.jinja_env.filters['strrev']('abcd'), 'dcba')\n\n    def test_add_template_filter_with_name(self):\n        app = flask.Flask(__name__)\n        def my_reverse(s):\n            return s[::-1]\n        app.add_template_filter(my_reverse, 'strrev')\n        self.assert_in('strrev', app.jinja_env.filters.keys())\n        self.assert_equal(app.jinja_env.filters['strrev'], my_reverse)\n        self.assert_equal(app.jinja_env.filters['strrev']('abcd'), 'dcba')\n\n    def test_template_filter_with_template(self):\n        app = flask.Flask(__name__)\n        @app.template_filter()\n        def super_reverse(s):\n            return s[::-1]\n        @app.route('/')\n        def index():\n            return flask.render_template('template_filter.html', value='abcd')\n        rv = app.test_client().get('/')\n        self.assert_equal(rv.data, b'dcba')\n\n    def test_add_template_filter_with_template(self):\n        app = flask.Flask(__name__)\n        def super_reverse(s):\n            return s[::-1]\n        app.add_template_filter(super_reverse)\n        @app.route('/')\n        def index():\n            return flask.render_template('template_filter.html', value='abcd')\n        rv = app.test_client().get('/')\n        self.assert_equal(rv.data, b'dcba')\n\n    def test_template_filter_with_name_and_template(self):\n        app = flask.Flask(__name__)\n        @app.template_filter('super_reverse')\n        def my_reverse(s):\n            return s[::-1]\n        @app.route('/')\n        def index():\n            return flask.render_template('template_filter.html', value='abcd')\n        rv = app.test_client().get('/')\n        self.assert_equal(rv.data, b'dcba')\n\n    def test_add_template_filter_with_name_and_template(self):\n        app = flask.Flask(__name__)\n        def my_reverse(s):\n            return s[::-1]\n        app.add_template_filter(my_reverse, 'super_reverse')\n        @app.route('/')\n        def index():\n            return flask.render_template('template_filter.html', value='abcd')\n        rv = app.test_client().get('/')\n        self.assert_equal(rv.data, b'dcba')\n\n    def test_template_test(self):\n        app = flask.Flask(__name__)\n        @app.template_test()\n        def boolean(value):\n            return isinstance(value, bool)\n        self.assert_in('boolean', app.jinja_env.tests.keys())\n        self.assert_equal(app.jinja_env.tests['boolean'], boolean)\n        self.assert_true(app.jinja_env.tests['boolean'](False))\n\n    def test_add_template_test(self):\n        app = flask.Flask(__name__)\n        def boolean(value):\n            return isinstance(value, bool)\n        app.add_template_test(boolean)\n        self.assert_in('boolean', app.jinja_env.tests.keys())\n        self.assert_equal(app.jinja_env.tests['boolean'], boolean)\n        self.assert_true(app.jinja_env.tests['boolean'](False))\n\n    def test_template_test_with_name(self):\n        app = flask.Flask(__name__)\n        @app.template_test('boolean')\n        def is_boolean(value):\n            return isinstance(value, bool)\n        self.assert_in('boolean', app.jinja_env.tests.keys())\n        self.assert_equal(app.jinja_env.tests['boolean'], is_boolean)\n        self.assert_true(app.jinja_env.tests['boolean'](False))\n\n    def test_add_template_test_with_name(self):\n        app = flask.Flask(__name__)\n        def is_boolean(value):\n            return isinstance(value, bool)\n        app.add_template_test(is_boolean, 'boolean')\n        self.assert_in('boolean', app.jinja_env.tests.keys())\n        self.assert_equal(app.jinja_env.tests['boolean'], is_boolean)\n        self.assert_true(app.jinja_env.tests['boolean'](False))\n\n    def test_template_test_with_template(self):\n        app = flask.Flask(__name__)\n        @app.template_test()\n        def boolean(value):\n            return isinstance(value, bool)\n        @app.route('/')\n        def index():\n            return flask.render_template('template_test.html', value=False)\n        rv = app.test_client().get('/')\n        self.assert_in(b'Success!', rv.data)\n\n    def test_add_template_test_with_template(self):\n        app = flask.Flask(__name__)\n        def boolean(value):\n            return isinstance(value, bool)\n        app.add_template_test(boolean)\n        @app.route('/')\n        def index():\n            return flask.render_template('template_test.html', value=False)\n        rv = app.test_client().get('/')\n        self.assert_in(b'Success!', rv.data)\n\n    def test_template_test_with_name_and_template(self):\n        app = flask.Flask(__name__)\n        @app.template_test('boolean')\n        def is_boolean(value):\n            return isinstance(value, bool)\n        @app.route('/')\n        def index():\n            return flask.render_template('template_test.html', value=False)\n        rv = app.test_client().get('/')\n        self.assert_in(b'Success!', rv.data)\n\n    def test_add_template_test_with_name_and_template(self):\n        app = flask.Flask(__name__)\n        def is_boolean(value):\n            return isinstance(value, bool)\n        app.add_template_test(is_boolean, 'boolean')\n        @app.route('/')\n        def index():\n            return flask.render_template('template_test.html', value=False)\n        rv = app.test_client().get('/')\n        self.assert_in(b'Success!', rv.data)\n\n    def test_add_template_global(self):\n        app = flask.Flask(__name__)\n        @app.template_global()\n        def get_stuff():\n            return 42\n        self.assert_in('get_stuff', app.jinja_env.globals.keys())\n        self.assert_equal(app.jinja_env.globals['get_stuff'], get_stuff)\n        self.assert_true(app.jinja_env.globals['get_stuff'](), 42)\n        with app.app_context():\n            rv = flask.render_template_string('{{ get_stuff() }}')\n            self.assert_equal(rv, '42')\n\n    def test_custom_template_loader(self):\n        class MyFlask(flask.Flask):\n            def create_global_jinja_loader(self):\n                from jinja2 import DictLoader\n                return DictLoader({'index.html': 'Hello Custom World!'})\n        app = MyFlask(__name__)\n        @app.route('/')\n        def index():\n            return flask.render_template('index.html')\n        c = app.test_client()\n        rv = c.get('/')\n        self.assert_equal(rv.data, b'Hello Custom World!')\n\n    def test_iterable_loader(self):\n        app = flask.Flask(__name__)\n        @app.context_processor\n        def context_processor():\n            return {'whiskey': 'Jameson'}\n        @app.route('/')\n        def index():\n            return flask.render_template(\n                ['no_template.xml', # should skip this one\n                'simple_template.html', # should render this\n                'context_template.html'],\n                value=23)\n\n        rv = app.test_client().get('/')\n        self.assert_equal(rv.data, b'<h1>Jameson</h1>')\n\n\ndef suite():\n    suite = unittest.TestSuite()\n    suite.addTest(unittest.makeSuite(TemplatingTestCase))\n    return suite\n"
  },
  {
    "path": "lib/flask/testsuite/test_apps/blueprintapp/__init__.py",
    "content": "from flask import Flask\n\napp = Flask(__name__)\nfrom blueprintapp.apps.admin import admin\nfrom blueprintapp.apps.frontend import frontend\napp.register_blueprint(admin)\napp.register_blueprint(frontend)\n"
  },
  {
    "path": "lib/flask/testsuite/test_apps/blueprintapp/apps/__init__.py",
    "content": ""
  },
  {
    "path": "lib/flask/testsuite/test_apps/blueprintapp/apps/admin/__init__.py",
    "content": "from flask import Blueprint, render_template\n\nadmin = Blueprint('admin', __name__, url_prefix='/admin',\n                  template_folder='templates',\n                  static_folder='static')\n\n\n@admin.route('/')\ndef index():\n    return render_template('admin/index.html')\n\n\n@admin.route('/index2')\ndef index2():\n    return render_template('./admin/index.html')\n"
  },
  {
    "path": "lib/flask/testsuite/test_apps/blueprintapp/apps/admin/static/css/test.css",
    "content": "/* nested file */\n"
  },
  {
    "path": "lib/flask/testsuite/test_apps/blueprintapp/apps/admin/static/test.txt",
    "content": "Admin File\n"
  },
  {
    "path": "lib/flask/testsuite/test_apps/blueprintapp/apps/admin/templates/admin/index.html",
    "content": "Hello from the Admin\n"
  },
  {
    "path": "lib/flask/testsuite/test_apps/blueprintapp/apps/frontend/__init__.py",
    "content": "from flask import Blueprint, render_template\n\nfrontend = Blueprint('frontend', __name__, template_folder='templates')\n\n\n@frontend.route('/')\ndef index():\n    return render_template('frontend/index.html')\n"
  },
  {
    "path": "lib/flask/testsuite/test_apps/blueprintapp/apps/frontend/templates/frontend/index.html",
    "content": "Hello from the Frontend\n"
  },
  {
    "path": "lib/flask/testsuite/test_apps/config_module_app.py",
    "content": "import os\nimport flask\nhere = os.path.abspath(os.path.dirname(__file__))\napp = flask.Flask(__name__)\n"
  },
  {
    "path": "lib/flask/testsuite/test_apps/config_package_app/__init__.py",
    "content": "import os\nimport flask\nhere = os.path.abspath(os.path.dirname(__file__))\napp = flask.Flask(__name__)\n"
  },
  {
    "path": "lib/flask/testsuite/test_apps/flask_broken/__init__.py",
    "content": "import flask.ext.broken.b\nimport missing_module\n"
  },
  {
    "path": "lib/flask/testsuite/test_apps/flask_broken/b.py",
    "content": ""
  },
  {
    "path": "lib/flask/testsuite/test_apps/flask_newext_package/__init__.py",
    "content": "ext_id = 'newext_package'\n"
  },
  {
    "path": "lib/flask/testsuite/test_apps/flask_newext_package/submodule.py",
    "content": "def test_function():\n    return 42\n"
  },
  {
    "path": "lib/flask/testsuite/test_apps/flask_newext_simple.py",
    "content": "ext_id = 'newext_simple'\n"
  },
  {
    "path": "lib/flask/testsuite/test_apps/flaskext/__init__.py",
    "content": ""
  },
  {
    "path": "lib/flask/testsuite/test_apps/flaskext/oldext_package/__init__.py",
    "content": "ext_id = 'oldext_package'\n"
  },
  {
    "path": "lib/flask/testsuite/test_apps/flaskext/oldext_package/submodule.py",
    "content": "def test_function():\n    return 42\n"
  },
  {
    "path": "lib/flask/testsuite/test_apps/flaskext/oldext_simple.py",
    "content": "ext_id = 'oldext_simple'\n"
  },
  {
    "path": "lib/flask/testsuite/test_apps/importerror.py",
    "content": "# NoImportsTestCase\nraise NotImplementedError\n"
  },
  {
    "path": "lib/flask/testsuite/test_apps/lib/python2.5/site-packages/site_app.py",
    "content": "import flask\n\napp = flask.Flask(__name__)\n"
  },
  {
    "path": "lib/flask/testsuite/test_apps/lib/python2.5/site-packages/site_package/__init__.py",
    "content": "import flask\n\napp = flask.Flask(__name__)\n"
  },
  {
    "path": "lib/flask/testsuite/test_apps/main_app.py",
    "content": "import flask\n\n# Test Flask initialization with main module.\napp = flask.Flask('__main__')\n"
  },
  {
    "path": "lib/flask/testsuite/test_apps/moduleapp/__init__.py",
    "content": "from flask import Flask\n\napp = Flask(__name__)\nfrom moduleapp.apps.admin import admin\nfrom moduleapp.apps.frontend import frontend\napp.register_module(admin)\napp.register_module(frontend)\n"
  },
  {
    "path": "lib/flask/testsuite/test_apps/moduleapp/apps/__init__.py",
    "content": ""
  },
  {
    "path": "lib/flask/testsuite/test_apps/moduleapp/apps/admin/__init__.py",
    "content": "from flask import Module, render_template\n\n\nadmin = Module(__name__, url_prefix='/admin')\n\n\n@admin.route('/')\ndef index():\n    return render_template('admin/index.html')\n\n\n@admin.route('/index2')\ndef index2():\n    return render_template('./admin/index.html')\n"
  },
  {
    "path": "lib/flask/testsuite/test_apps/moduleapp/apps/admin/static/css/test.css",
    "content": "/* nested file */\n"
  },
  {
    "path": "lib/flask/testsuite/test_apps/moduleapp/apps/admin/static/test.txt",
    "content": "Admin File\n"
  },
  {
    "path": "lib/flask/testsuite/test_apps/moduleapp/apps/admin/templates/index.html",
    "content": "Hello from the Admin\n"
  },
  {
    "path": "lib/flask/testsuite/test_apps/moduleapp/apps/frontend/__init__.py",
    "content": "from flask import Module, render_template\n\n\nfrontend = Module(__name__)\n\n\n@frontend.route('/')\ndef index():\n    return render_template('frontend/index.html')\n"
  },
  {
    "path": "lib/flask/testsuite/test_apps/moduleapp/apps/frontend/templates/index.html",
    "content": "Hello from the Frontend\n"
  },
  {
    "path": "lib/flask/testsuite/test_apps/path/installed_package/__init__.py",
    "content": "import flask\n\napp = flask.Flask(__name__)\n"
  },
  {
    "path": "lib/flask/testsuite/test_apps/subdomaintestmodule/__init__.py",
    "content": "from flask import Module\n\n\nmod = Module(__name__, 'foo', subdomain='foo')\n"
  },
  {
    "path": "lib/flask/testsuite/test_apps/subdomaintestmodule/static/hello.txt",
    "content": "Hello Subdomain\n"
  },
  {
    "path": "lib/flask/testsuite/testing.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    flask.testsuite.testing\n    ~~~~~~~~~~~~~~~~~~~~~~~\n\n    Test client and more.\n\n    :copyright: (c) 2011 by Armin Ronacher.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\n\nimport flask\nimport unittest\nfrom flask.testsuite import FlaskTestCase\nfrom flask._compat import text_type\n\n\nclass TestToolsTestCase(FlaskTestCase):\n\n    def test_environ_defaults_from_config(self):\n        app = flask.Flask(__name__)\n        app.testing = True\n        app.config['SERVER_NAME'] = 'example.com:1234'\n        app.config['APPLICATION_ROOT'] = '/foo'\n        @app.route('/')\n        def index():\n            return flask.request.url\n\n        ctx = app.test_request_context()\n        self.assert_equal(ctx.request.url, 'http://example.com:1234/foo/')\n        with app.test_client() as c:\n            rv = c.get('/')\n            self.assert_equal(rv.data, b'http://example.com:1234/foo/')\n\n    def test_environ_defaults(self):\n        app = flask.Flask(__name__)\n        app.testing = True\n        @app.route('/')\n        def index():\n            return flask.request.url\n\n        ctx = app.test_request_context()\n        self.assert_equal(ctx.request.url, 'http://localhost/')\n        with app.test_client() as c:\n            rv = c.get('/')\n            self.assert_equal(rv.data, b'http://localhost/')\n\n    def test_redirect_keep_session(self):\n        app = flask.Flask(__name__)\n        app.secret_key = 'testing'\n\n        @app.route('/', methods=['GET', 'POST'])\n        def index():\n            if flask.request.method == 'POST':\n                return flask.redirect('/getsession')\n            flask.session['data'] = 'foo'\n            return 'index'\n\n        @app.route('/getsession')\n        def get_session():\n            return flask.session.get('data', '<missing>')\n\n        with app.test_client() as c:\n            rv = c.get('/getsession')\n            assert rv.data == b'<missing>'\n\n            rv = c.get('/')\n            assert rv.data == b'index'\n            assert flask.session.get('data') == 'foo'\n            rv = c.post('/', data={}, follow_redirects=True)\n            assert rv.data == b'foo'\n\n            # This support requires a new Werkzeug version\n            if not hasattr(c, 'redirect_client'):\n                assert flask.session.get('data') == 'foo'\n\n            rv = c.get('/getsession')\n            assert rv.data == b'foo'\n\n    def test_session_transactions(self):\n        app = flask.Flask(__name__)\n        app.testing = True\n        app.secret_key = 'testing'\n\n        @app.route('/')\n        def index():\n            return text_type(flask.session['foo'])\n\n        with app.test_client() as c:\n            with c.session_transaction() as sess:\n                self.assert_equal(len(sess), 0)\n                sess['foo'] = [42]\n                self.assert_equal(len(sess), 1)\n            rv = c.get('/')\n            self.assert_equal(rv.data, b'[42]')\n            with c.session_transaction() as sess:\n                self.assert_equal(len(sess), 1)\n                self.assert_equal(sess['foo'], [42])\n\n    def test_session_transactions_no_null_sessions(self):\n        app = flask.Flask(__name__)\n        app.testing = True\n\n        with app.test_client() as c:\n            try:\n                with c.session_transaction() as sess:\n                    pass\n            except RuntimeError as e:\n                self.assert_in('Session backend did not open a session', str(e))\n            else:\n                self.fail('Expected runtime error')\n\n    def test_session_transactions_keep_context(self):\n        app = flask.Flask(__name__)\n        app.testing = True\n        app.secret_key = 'testing'\n\n        with app.test_client() as c:\n            rv = c.get('/')\n            req = flask.request._get_current_object()\n            self.assert_true(req is not None)\n            with c.session_transaction():\n                self.assert_true(req is flask.request._get_current_object())\n\n    def test_session_transaction_needs_cookies(self):\n        app = flask.Flask(__name__)\n        app.testing = True\n        c = app.test_client(use_cookies=False)\n        try:\n            with c.session_transaction() as s:\n                pass\n        except RuntimeError as e:\n            self.assert_in('cookies', str(e))\n        else:\n            self.fail('Expected runtime error')\n\n    def test_test_client_context_binding(self):\n        app = flask.Flask(__name__)\n        @app.route('/')\n        def index():\n            flask.g.value = 42\n            return 'Hello World!'\n\n        @app.route('/other')\n        def other():\n            1 // 0\n\n        with app.test_client() as c:\n            resp = c.get('/')\n            self.assert_equal(flask.g.value, 42)\n            self.assert_equal(resp.data, b'Hello World!')\n            self.assert_equal(resp.status_code, 200)\n\n            resp = c.get('/other')\n            self.assert_false(hasattr(flask.g, 'value'))\n            self.assert_in(b'Internal Server Error', resp.data)\n            self.assert_equal(resp.status_code, 500)\n            flask.g.value = 23\n\n        try:\n            flask.g.value\n        except (AttributeError, RuntimeError):\n            pass\n        else:\n            raise AssertionError('some kind of exception expected')\n\n    def test_reuse_client(self):\n        app = flask.Flask(__name__)\n        c = app.test_client()\n\n        with c:\n            self.assert_equal(c.get('/').status_code, 404)\n\n        with c:\n            self.assert_equal(c.get('/').status_code, 404)\n\n    def test_test_client_calls_teardown_handlers(self):\n        app = flask.Flask(__name__)\n        called = []\n        @app.teardown_request\n        def remember(error):\n            called.append(error)\n\n        with app.test_client() as c:\n            self.assert_equal(called, [])\n            c.get('/')\n            self.assert_equal(called, [])\n        self.assert_equal(called, [None])\n\n        del called[:]\n        with app.test_client() as c:\n            self.assert_equal(called, [])\n            c.get('/')\n            self.assert_equal(called, [])\n            c.get('/')\n            self.assert_equal(called, [None])\n        self.assert_equal(called, [None, None])\n\n\nclass SubdomainTestCase(FlaskTestCase):\n\n    def setUp(self):\n        self.app = flask.Flask(__name__)\n        self.app.config['SERVER_NAME'] = 'example.com'\n        self.client = self.app.test_client()\n\n        self._ctx = self.app.test_request_context()\n        self._ctx.push()\n\n    def tearDown(self):\n        if self._ctx is not None:\n            self._ctx.pop()\n\n    def test_subdomain(self):\n        @self.app.route('/', subdomain='<company_id>')\n        def view(company_id):\n            return company_id\n\n        url = flask.url_for('view', company_id='xxx')\n        response = self.client.get(url)\n\n        self.assert_equal(200, response.status_code)\n        self.assert_equal(b'xxx', response.data)\n\n\n    def test_nosubdomain(self):\n        @self.app.route('/<company_id>')\n        def view(company_id):\n            return company_id\n\n        url = flask.url_for('view', company_id='xxx')\n        response = self.client.get(url)\n\n        self.assert_equal(200, response.status_code)\n        self.assert_equal(b'xxx', response.data)\n\n\ndef suite():\n    suite = unittest.TestSuite()\n    suite.addTest(unittest.makeSuite(TestToolsTestCase))\n    suite.addTest(unittest.makeSuite(SubdomainTestCase))\n    return suite\n"
  },
  {
    "path": "lib/flask/testsuite/views.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    flask.testsuite.views\n    ~~~~~~~~~~~~~~~~~~~~~\n\n    Pluggable views.\n\n    :copyright: (c) 2011 by Armin Ronacher.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\n\nimport flask\nimport flask.views\nimport unittest\nfrom flask.testsuite import FlaskTestCase\nfrom werkzeug.http import parse_set_header\n\nclass ViewTestCase(FlaskTestCase):\n\n    def common_test(self, app):\n        c = app.test_client()\n\n        self.assert_equal(c.get('/').data, b'GET')\n        self.assert_equal(c.post('/').data, b'POST')\n        self.assert_equal(c.put('/').status_code, 405)\n        meths = parse_set_header(c.open('/', method='OPTIONS').headers['Allow'])\n        self.assert_equal(sorted(meths), ['GET', 'HEAD', 'OPTIONS', 'POST'])\n\n    def test_basic_view(self):\n        app = flask.Flask(__name__)\n\n        class Index(flask.views.View):\n            methods = ['GET', 'POST']\n            def dispatch_request(self):\n                return flask.request.method\n\n        app.add_url_rule('/', view_func=Index.as_view('index'))\n        self.common_test(app)\n\n    def test_method_based_view(self):\n        app = flask.Flask(__name__)\n\n        class Index(flask.views.MethodView):\n            def get(self):\n                return 'GET'\n            def post(self):\n                return 'POST'\n\n        app.add_url_rule('/', view_func=Index.as_view('index'))\n\n        self.common_test(app)\n\n    def test_view_patching(self):\n        app = flask.Flask(__name__)\n\n        class Index(flask.views.MethodView):\n            def get(self):\n                1 // 0\n            def post(self):\n                1 // 0\n\n        class Other(Index):\n            def get(self):\n                return 'GET'\n            def post(self):\n                return 'POST'\n\n        view = Index.as_view('index')\n        view.view_class = Other\n        app.add_url_rule('/', view_func=view)\n        self.common_test(app)\n\n    def test_view_inheritance(self):\n        app = flask.Flask(__name__)\n\n        class Index(flask.views.MethodView):\n            def get(self):\n                return 'GET'\n            def post(self):\n                return 'POST'\n\n        class BetterIndex(Index):\n            def delete(self):\n                return 'DELETE'\n\n        app.add_url_rule('/', view_func=BetterIndex.as_view('index'))\n        c = app.test_client()\n\n        meths = parse_set_header(c.open('/', method='OPTIONS').headers['Allow'])\n        self.assert_equal(sorted(meths), ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST'])\n\n    def test_view_decorators(self):\n        app = flask.Flask(__name__)\n\n        def add_x_parachute(f):\n            def new_function(*args, **kwargs):\n                resp = flask.make_response(f(*args, **kwargs))\n                resp.headers['X-Parachute'] = 'awesome'\n                return resp\n            return new_function\n\n        class Index(flask.views.View):\n            decorators = [add_x_parachute]\n            def dispatch_request(self):\n                return 'Awesome'\n\n        app.add_url_rule('/', view_func=Index.as_view('index'))\n        c = app.test_client()\n        rv = c.get('/')\n        self.assert_equal(rv.headers['X-Parachute'], 'awesome')\n        self.assert_equal(rv.data, b'Awesome')\n\n    def test_implicit_head(self):\n        app = flask.Flask(__name__)\n\n        class Index(flask.views.MethodView):\n            def get(self):\n                return flask.Response('Blub', headers={\n                    'X-Method': flask.request.method\n                })\n\n        app.add_url_rule('/', view_func=Index.as_view('index'))\n        c = app.test_client()\n        rv = c.get('/')\n        self.assert_equal(rv.data, b'Blub')\n        self.assert_equal(rv.headers['X-Method'], 'GET')\n        rv = c.head('/')\n        self.assert_equal(rv.data, b'')\n        self.assert_equal(rv.headers['X-Method'], 'HEAD')\n\n    def test_explicit_head(self):\n        app = flask.Flask(__name__)\n\n        class Index(flask.views.MethodView):\n            def get(self):\n                return 'GET'\n            def head(self):\n                return flask.Response('', headers={'X-Method': 'HEAD'})\n\n        app.add_url_rule('/', view_func=Index.as_view('index'))\n        c = app.test_client()\n        rv = c.get('/')\n        self.assert_equal(rv.data, b'GET')\n        rv = c.head('/')\n        self.assert_equal(rv.data, b'')\n        self.assert_equal(rv.headers['X-Method'], 'HEAD')\n\n    def test_endpoint_override(self):\n        app = flask.Flask(__name__)\n        app.debug = True\n\n        class Index(flask.views.View):\n            methods = ['GET', 'POST']\n            def dispatch_request(self):\n                return flask.request.method\n\n        app.add_url_rule('/', view_func=Index.as_view('index'))\n\n        with self.assert_raises(AssertionError):\n            app.add_url_rule('/', view_func=Index.as_view('index'))\n\n        # But these tests should still pass. We just log a warning.\n        self.common_test(app)\n\n\ndef suite():\n    suite = unittest.TestSuite()\n    suite.addTest(unittest.makeSuite(ViewTestCase))\n    return suite\n"
  },
  {
    "path": "lib/flask/views.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    flask.views\n    ~~~~~~~~~~~\n\n    This module provides class-based views inspired by the ones in Django.\n\n    :copyright: (c) 2011 by Armin Ronacher.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nfrom .globals import request\nfrom ._compat import with_metaclass\n\n\nhttp_method_funcs = frozenset(['get', 'post', 'head', 'options',\n                               'delete', 'put', 'trace', 'patch'])\n\n\nclass View(object):\n    \"\"\"Alternative way to use view functions.  A subclass has to implement\n    :meth:`dispatch_request` which is called with the view arguments from\n    the URL routing system.  If :attr:`methods` is provided the methods\n    do not have to be passed to the :meth:`~flask.Flask.add_url_rule`\n    method explicitly::\n\n        class MyView(View):\n            methods = ['GET']\n\n            def dispatch_request(self, name):\n                return 'Hello %s!' % name\n\n        app.add_url_rule('/hello/<name>', view_func=MyView.as_view('myview'))\n\n    When you want to decorate a pluggable view you will have to either do that\n    when the view function is created (by wrapping the return value of\n    :meth:`as_view`) or you can use the :attr:`decorators` attribute::\n\n        class SecretView(View):\n            methods = ['GET']\n            decorators = [superuser_required]\n\n            def dispatch_request(self):\n                ...\n\n    The decorators stored in the decorators list are applied one after another\n    when the view function is created.  Note that you can *not* use the class\n    based decorators since those would decorate the view class and not the\n    generated view function!\n    \"\"\"\n\n    #: A for which methods this pluggable view can handle.\n    methods = None\n\n    #: The canonical way to decorate class-based views is to decorate the\n    #: return value of as_view().  However since this moves parts of the\n    #: logic from the class declaration to the place where it's hooked\n    #: into the routing system.\n    #:\n    #: You can place one or more decorators in this list and whenever the\n    #: view function is created the result is automatically decorated.\n    #:\n    #: .. versionadded:: 0.8\n    decorators = []\n\n    def dispatch_request(self):\n        \"\"\"Subclasses have to override this method to implement the\n        actual view function code.  This method is called with all\n        the arguments from the URL rule.\n        \"\"\"\n        raise NotImplementedError()\n\n    @classmethod\n    def as_view(cls, name, *class_args, **class_kwargs):\n        \"\"\"Converts the class into an actual view function that can be used\n        with the routing system.  Internally this generates a function on the\n        fly which will instantiate the :class:`View` on each request and call\n        the :meth:`dispatch_request` method on it.\n\n        The arguments passed to :meth:`as_view` are forwarded to the\n        constructor of the class.\n        \"\"\"\n        def view(*args, **kwargs):\n            self = view.view_class(*class_args, **class_kwargs)\n            return self.dispatch_request(*args, **kwargs)\n\n        if cls.decorators:\n            view.__name__ = name\n            view.__module__ = cls.__module__\n            for decorator in cls.decorators:\n                view = decorator(view)\n\n        # we attach the view class to the view function for two reasons:\n        # first of all it allows us to easily figure out what class-based\n        # view this thing came from, secondly it's also used for instantiating\n        # the view class so you can actually replace it with something else\n        # for testing purposes and debugging.\n        view.view_class = cls\n        view.__name__ = name\n        view.__doc__ = cls.__doc__\n        view.__module__ = cls.__module__\n        view.methods = cls.methods\n        return view\n\n\nclass MethodViewType(type):\n\n    def __new__(cls, name, bases, d):\n        rv = type.__new__(cls, name, bases, d)\n        if 'methods' not in d:\n            methods = set(rv.methods or [])\n            for key in d:\n                if key in http_method_funcs:\n                    methods.add(key.upper())\n            # if we have no method at all in there we don't want to\n            # add a method list.  (This is for instance the case for\n            # the baseclass or another subclass of a base method view\n            # that does not introduce new methods).\n            if methods:\n                rv.methods = sorted(methods)\n        return rv\n\n\nclass MethodView(with_metaclass(MethodViewType, View)):\n    \"\"\"Like a regular class-based view but that dispatches requests to\n    particular methods.  For instance if you implement a method called\n    :meth:`get` it means you will response to ``'GET'`` requests and\n    the :meth:`dispatch_request` implementation will automatically\n    forward your request to that.  Also :attr:`options` is set for you\n    automatically::\n\n        class CounterAPI(MethodView):\n\n            def get(self):\n                return session.get('counter', 0)\n\n            def post(self):\n                session['counter'] = session.get('counter', 0) + 1\n                return 'OK'\n\n        app.add_url_rule('/counter', view_func=CounterAPI.as_view('counter'))\n    \"\"\"\n    def dispatch_request(self, *args, **kwargs):\n        meth = getattr(self, request.method.lower(), None)\n        # if the request method is HEAD and we don't have a handler for it\n        # retry with GET\n        if meth is None and request.method == 'HEAD':\n            meth = getattr(self, 'get', None)\n        assert meth is not None, 'Unimplemented method %r' % request.method\n        return meth(*args, **kwargs)\n"
  },
  {
    "path": "lib/flask/wrappers.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    flask.wrappers\n    ~~~~~~~~~~~~~~\n\n    Implements the WSGI wrappers (request and response).\n\n    :copyright: (c) 2011 by Armin Ronacher.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\n\nfrom werkzeug.wrappers import Request as RequestBase, Response as ResponseBase\nfrom werkzeug.exceptions import BadRequest\n\nfrom .debughelpers import attach_enctype_error_multidict\nfrom . import json\nfrom .globals import _request_ctx_stack\n\n\n_missing = object()\n\n\ndef _get_data(req, cache):\n    getter = getattr(req, 'get_data', None)\n    if getter is not None:\n        return getter(cache=cache)\n    return req.data\n\n\nclass Request(RequestBase):\n    \"\"\"The request object used by default in Flask.  Remembers the\n    matched endpoint and view arguments.\n\n    It is what ends up as :class:`~flask.request`.  If you want to replace\n    the request object used you can subclass this and set\n    :attr:`~flask.Flask.request_class` to your subclass.\n\n    The request object is a :class:`~werkzeug.wrappers.Request` subclass and\n    provides all of the attributes Werkzeug defines plus a few Flask\n    specific ones.\n    \"\"\"\n\n    #: the internal URL rule that matched the request.  This can be\n    #: useful to inspect which methods are allowed for the URL from\n    #: a before/after handler (``request.url_rule.methods``) etc.\n    #:\n    #: .. versionadded:: 0.6\n    url_rule = None\n\n    #: a dict of view arguments that matched the request.  If an exception\n    #: happened when matching, this will be `None`.\n    view_args = None\n\n    #: if matching the URL failed, this is the exception that will be\n    #: raised / was raised as part of the request handling.  This is\n    #: usually a :exc:`~werkzeug.exceptions.NotFound` exception or\n    #: something similar.\n    routing_exception = None\n\n    # switched by the request context until 1.0 to opt in deprecated\n    # module functionality\n    _is_old_module = False\n\n    @property\n    def max_content_length(self):\n        \"\"\"Read-only view of the `MAX_CONTENT_LENGTH` config key.\"\"\"\n        ctx = _request_ctx_stack.top\n        if ctx is not None:\n            return ctx.app.config['MAX_CONTENT_LENGTH']\n\n    @property\n    def endpoint(self):\n        \"\"\"The endpoint that matched the request.  This in combination with\n        :attr:`view_args` can be used to reconstruct the same or a\n        modified URL.  If an exception happened when matching, this will\n        be `None`.\n        \"\"\"\n        if self.url_rule is not None:\n            return self.url_rule.endpoint\n\n    @property\n    def module(self):\n        \"\"\"The name of the current module if the request was dispatched\n        to an actual module.  This is deprecated functionality, use blueprints\n        instead.\n        \"\"\"\n        from warnings import warn\n        warn(DeprecationWarning('modules were deprecated in favor of '\n                                'blueprints.  Use request.blueprint '\n                                'instead.'), stacklevel=2)\n        if self._is_old_module:\n            return self.blueprint\n\n    @property\n    def blueprint(self):\n        \"\"\"The name of the current blueprint\"\"\"\n        if self.url_rule and '.' in self.url_rule.endpoint:\n            return self.url_rule.endpoint.rsplit('.', 1)[0]\n\n    @property\n    def json(self):\n        \"\"\"If the mimetype is `application/json` this will contain the\n        parsed JSON data.  Otherwise this will be `None`.\n\n        The :meth:`get_json` method should be used instead.\n        \"\"\"\n        # XXX: deprecate property\n        return self.get_json()\n\n    def get_json(self, force=False, silent=False, cache=True):\n        \"\"\"Parses the incoming JSON request data and returns it.  If\n        parsing fails the :meth:`on_json_loading_failed` method on the\n        request object will be invoked.  By default this function will\n        only load the json data if the mimetype is ``application/json``\n        but this can be overriden by the `force` parameter.\n\n        :param force: if set to `True` the mimetype is ignored.\n        :param silent: if set to `False` this method will fail silently\n                       and return `False`.\n        :param cache: if set to `True` the parsed JSON data is remembered\n                      on the request.\n        \"\"\"\n        rv = getattr(self, '_cached_json', _missing)\n        if rv is not _missing:\n            return rv\n\n        if self.mimetype != 'application/json' and not force:\n            return None\n\n        # We accept a request charset against the specification as\n        # certain clients have been using this in the past.  This\n        # fits our general approach of being nice in what we accept\n        # and strict in what we send out.\n        request_charset = self.mimetype_params.get('charset')\n        try:\n            data = _get_data(self, cache)\n            if request_charset is not None:\n                rv = json.loads(data, encoding=request_charset)\n            else:\n                rv = json.loads(data)\n        except ValueError as e:\n            if silent:\n                rv = None\n            else:\n                rv = self.on_json_loading_failed(e)\n        if cache:\n            self._cached_json = rv\n        return rv\n\n    def on_json_loading_failed(self, e):\n        \"\"\"Called if decoding of the JSON data failed.  The return value of\n        this method is used by :meth:`get_json` when an error occurred.  The\n        default implementation just raises a :class:`BadRequest` exception.\n\n        .. versionchanged:: 0.10\n           Removed buggy previous behavior of generating a random JSON\n           response.  If you want that behavior back you can trivially\n           add it by subclassing.\n\n        .. versionadded:: 0.8\n        \"\"\"\n        raise BadRequest()\n\n    def _load_form_data(self):\n        RequestBase._load_form_data(self)\n\n        # in debug mode we're replacing the files multidict with an ad-hoc\n        # subclass that raises a different error for key errors.\n        ctx = _request_ctx_stack.top\n        if ctx is not None and ctx.app.debug and \\\n           self.mimetype != 'multipart/form-data' and not self.files:\n            attach_enctype_error_multidict(self)\n\n\nclass Response(ResponseBase):\n    \"\"\"The response object that is used by default in Flask.  Works like the\n    response object from Werkzeug but is set to have an HTML mimetype by\n    default.  Quite often you don't have to create this object yourself because\n    :meth:`~flask.Flask.make_response` will take care of that for you.\n\n    If you want to replace the response object used you can subclass this and\n    set :attr:`~flask.Flask.response_class` to your subclass.\n    \"\"\"\n    default_mimetype = 'text/html'\n"
  },
  {
    "path": "lib/itsdangerous-0.24.dist-info/DESCRIPTION.rst",
    "content": "UNKNOWN\n\n\n"
  },
  {
    "path": "lib/itsdangerous-0.24.dist-info/METADATA",
    "content": "Metadata-Version: 2.0\nName: itsdangerous\nVersion: 0.24\nSummary: Various helpers to pass trusted data to untrusted environments and back.\nHome-page: http://github.com/mitsuhiko/itsdangerous\nAuthor: Armin Ronacher\nAuthor-email: armin.ronacher@active-4.com\nLicense: UNKNOWN\nPlatform: UNKNOWN\nClassifier: License :: OSI Approved :: BSD License\nClassifier: Programming Language :: Python\nClassifier: Programming Language :: Python :: 3\n\nUNKNOWN\n\n\n"
  },
  {
    "path": "lib/itsdangerous-0.24.dist-info/RECORD",
    "content": "itsdangerous.py,sha256=l7u6oqIepEllYDR7hRmoE7z47Ry6vtFCF6EAbJt-ilI,31840\r\nitsdangerous-0.24.dist-info/DESCRIPTION.rst,sha256=OCTuuN6LcWulhHS3d5rfjdsQtW22n7HENFRh6jC6ego,10\r\nitsdangerous-0.24.dist-info/METADATA,sha256=9b-dx0zycw57kVzRJ7mF7j_shyBFpAZOyfxuwPsYYcQ,442\r\nitsdangerous-0.24.dist-info/metadata.json,sha256=f2riYFkirAtYbde3PVNg6FdciH6WrM3hgAHrd7ohpWM,586\r\nitsdangerous-0.24.dist-info/RECORD,,\r\nitsdangerous-0.24.dist-info/top_level.txt,sha256=gKN1OKLk81i7fbWWildJA88EQ9NhnGMSvZqhfz9ICjk,13\r\nitsdangerous-0.24.dist-info/WHEEL,sha256=54bVun1KfEBTJ68SHUmbxNPj80VxlQ0sHi4gZdGZXEY,92\r\nitsdangerous.pyc,,\r\n"
  },
  {
    "path": "lib/itsdangerous-0.24.dist-info/WHEEL",
    "content": "Wheel-Version: 1.0\nGenerator: bdist_wheel (0.24.0)\nRoot-Is-Purelib: true\nTag: py2-none-any\n\n"
  },
  {
    "path": "lib/itsdangerous-0.24.dist-info/metadata.json",
    "content": "{\"summary\": \"Various helpers to pass trusted data to untrusted environments and back.\", \"metadata_version\": \"2.0\", \"extensions\": {\"python.details\": {\"project_urls\": {\"Home\": \"http://github.com/mitsuhiko/itsdangerous\"}, \"contacts\": [{\"role\": \"author\", \"email\": \"armin.ronacher@active-4.com\", \"name\": \"Armin Ronacher\"}], \"document_names\": {\"description\": \"DESCRIPTION.rst\"}}}, \"generator\": \"bdist_wheel (0.24.0)\", \"classifiers\": [\"License :: OSI Approved :: BSD License\", \"Programming Language :: Python\", \"Programming Language :: Python :: 3\"], \"version\": \"0.24\", \"name\": \"itsdangerous\"}"
  },
  {
    "path": "lib/itsdangerous-0.24.dist-info/top_level.txt",
    "content": "itsdangerous\n"
  },
  {
    "path": "lib/itsdangerous.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    itsdangerous\n    ~~~~~~~~~~~~\n\n    A module that implements various functions to deal with untrusted\n    sources.  Mainly useful for web applications.\n\n    :copyright: (c) 2014 by Armin Ronacher and the Django Software Foundation.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\n\nimport sys\nimport hmac\nimport zlib\nimport time\nimport base64\nimport hashlib\nimport operator\nfrom datetime import datetime\n\n\nPY2 = sys.version_info[0] == 2\nif PY2:\n    from itertools import izip\n    text_type = unicode\n    int_to_byte = chr\n    number_types = (int, long, float)\nelse:\n    from functools import reduce\n    izip = zip\n    text_type = str\n    int_to_byte = operator.methodcaller('to_bytes', 1, 'big')\n    number_types = (int, float)\n\n\ntry:\n    import simplejson as json\nexcept ImportError:\n    import json\n\n\nclass _CompactJSON(object):\n    \"\"\"Wrapper around simplejson that strips whitespace.\n    \"\"\"\n\n    def loads(self, payload):\n        return json.loads(payload)\n\n    def dumps(self, obj):\n        return json.dumps(obj, separators=(',', ':'))\n\n\ncompact_json = _CompactJSON()\n\n\n# 2011/01/01 in UTC\nEPOCH = 1293840000\n\n\ndef want_bytes(s, encoding='utf-8', errors='strict'):\n    if isinstance(s, text_type):\n        s = s.encode(encoding, errors)\n    return s\n\n\ndef is_text_serializer(serializer):\n    \"\"\"Checks wheather a serializer generates text or binary.\"\"\"\n    return isinstance(serializer.dumps({}), text_type)\n\n\n# Starting with 3.3 the standard library has a c-implementation for\n# constant time string compares.\n_builtin_constant_time_compare = getattr(hmac, 'compare_digest', None)\n\n\ndef constant_time_compare(val1, val2):\n    \"\"\"Returns True if the two strings are equal, False otherwise.\n\n    The time taken is independent of the number of characters that match.  Do\n    not use this function for anything else than comparision with known\n    length targets.\n\n    This is should be implemented in C in order to get it completely right.\n    \"\"\"\n    if _builtin_constant_time_compare is not None:\n        return _builtin_constant_time_compare(val1, val2)\n    len_eq = len(val1) == len(val2)\n    if len_eq:\n        result = 0\n        left = val1\n    else:\n        result = 1\n        left = val2\n    for x, y in izip(bytearray(left), bytearray(val2)):\n        result |= x ^ y\n    return result == 0\n\n\nclass BadData(Exception):\n    \"\"\"Raised if bad data of any sort was encountered.  This is the\n    base for all exceptions that itsdangerous is currently using.\n\n    .. versionadded:: 0.15\n    \"\"\"\n    message = None\n\n    def __init__(self, message):\n        Exception.__init__(self, message)\n        self.message = message\n\n    def __str__(self):\n        return text_type(self.message)\n\n    if PY2:\n        __unicode__ = __str__\n        def __str__(self):\n            return self.__unicode__().encode('utf-8')\n\n\nclass BadPayload(BadData):\n    \"\"\"This error is raised in situations when payload is loaded without\n    checking the signature first and an exception happend as a result of\n    that.  The original exception that caused that will be stored on the\n    exception as :attr:`original_error`.\n\n    This can also happen with a :class:`JSONWebSignatureSerializer` that\n    is subclassed and uses a different serializer for the payload than\n    the expected one.\n\n    .. versionadded:: 0.15\n    \"\"\"\n\n    def __init__(self, message, original_error=None):\n        BadData.__init__(self, message)\n        #: If available, the error that indicates why the payload\n        #: was not valid.  This might be `None`.\n        self.original_error = original_error\n\n\nclass BadSignature(BadData):\n    \"\"\"This error is raised if a signature does not match.  As of\n    itsdangerous 0.14 there are helpful attributes on the exception\n    instances.  You can also catch down the baseclass :exc:`BadData`.\n    \"\"\"\n\n    def __init__(self, message, payload=None):\n        BadData.__init__(self, message)\n        #: The payload that failed the signature test.  In some\n        #: situations you might still want to inspect this, even if\n        #: you know it was tampered with.\n        #:\n        #: .. versionadded:: 0.14\n        self.payload = payload\n\n\nclass BadTimeSignature(BadSignature):\n    \"\"\"Raised for time based signatures that fail.  This is a subclass\n    of :class:`BadSignature` so you can catch those down as well.\n    \"\"\"\n\n    def __init__(self, message, payload=None, date_signed=None):\n        BadSignature.__init__(self, message, payload)\n\n        #: If the signature expired this exposes the date of when the\n        #: signature was created.  This can be helpful in order to\n        #: tell the user how long a link has been gone stale.\n        #:\n        #: .. versionadded:: 0.14\n        self.date_signed = date_signed\n\n\nclass BadHeader(BadSignature):\n    \"\"\"Raised if a signed header is invalid in some form.  This only\n    happens for serializers that have a header that goes with the\n    signature.\n\n    .. versionadded:: 0.24\n    \"\"\"\n\n    def __init__(self, message, payload=None, header=None,\n                 original_error=None):\n        BadSignature.__init__(self, message, payload)\n\n        #: If the header is actually available but just malformed it\n        #: might be stored here.\n        self.header = header\n\n        #: If available, the error that indicates why the payload\n        #: was not valid.  This might be `None`.\n        self.original_error = original_error\n\n\nclass SignatureExpired(BadTimeSignature):\n    \"\"\"Signature timestamp is older than required max_age.  This is a\n    subclass of :exc:`BadTimeSignature` so you can use the baseclass for\n    catching the error.\n    \"\"\"\n\n\ndef base64_encode(string):\n    \"\"\"base64 encodes a single bytestring (and is tolerant to getting\n    called with a unicode string).\n    The resulting bytestring is safe for putting into URLs.\n    \"\"\"\n    string = want_bytes(string)\n    return base64.urlsafe_b64encode(string).strip(b'=')\n\n\ndef base64_decode(string):\n    \"\"\"base64 decodes a single bytestring (and is tolerant to getting\n    called with a unicode string).\n    The result is also a bytestring.\n    \"\"\"\n    string = want_bytes(string, encoding='ascii', errors='ignore')\n    return base64.urlsafe_b64decode(string + b'=' * (-len(string) % 4))\n\n\ndef int_to_bytes(num):\n    assert num >= 0\n    rv = []\n    while num:\n        rv.append(int_to_byte(num & 0xff))\n        num >>= 8\n    return b''.join(reversed(rv))\n\n\ndef bytes_to_int(bytestr):\n    return reduce(lambda a, b: a << 8 | b, bytearray(bytestr), 0)\n\n\nclass SigningAlgorithm(object):\n    \"\"\"Subclasses of `SigningAlgorithm` have to implement `get_signature` to\n    provide signature generation functionality.\n    \"\"\"\n\n    def get_signature(self, key, value):\n        \"\"\"Returns the signature for the given key and value\"\"\"\n        raise NotImplementedError()\n\n    def verify_signature(self, key, value, sig):\n        \"\"\"Verifies the given signature matches the expected signature\"\"\"\n        return constant_time_compare(sig, self.get_signature(key, value))\n\n\nclass NoneAlgorithm(SigningAlgorithm):\n    \"\"\"This class provides a algorithm that does not perform any signing and\n    returns an empty signature.\n    \"\"\"\n\n    def get_signature(self, key, value):\n        return b''\n\n\nclass HMACAlgorithm(SigningAlgorithm):\n    \"\"\"This class provides signature generation using HMACs.\"\"\"\n\n    #: The digest method to use with the MAC algorithm.  This defaults to sha1\n    #: but can be changed for any other function in the hashlib module.\n    default_digest_method = staticmethod(hashlib.sha1)\n\n    def __init__(self, digest_method=None):\n        if digest_method is None:\n            digest_method = self.default_digest_method\n        self.digest_method = digest_method\n\n    def get_signature(self, key, value):\n        mac = hmac.new(key, msg=value, digestmod=self.digest_method)\n        return mac.digest()\n\n\nclass Signer(object):\n    \"\"\"This class can sign bytes and unsign it and validate the signature\n    provided.\n\n    Salt can be used to namespace the hash, so that a signed string is only\n    valid for a given namespace.  Leaving this at the default value or re-using\n    a salt value across different parts of your application where the same\n    signed value in one part can mean something different in another part\n    is a security risk.\n\n    See :ref:`the-salt` for an example of what the salt is doing and how you\n    can utilize it.\n\n    .. versionadded:: 0.14\n       `key_derivation` and `digest_method` were added as arguments to the\n       class constructor.\n\n    .. versionadded:: 0.18\n        `algorithm` was added as an argument to the class constructor.\n    \"\"\"\n\n    #: The digest method to use for the signer.  This defaults to sha1 but can\n    #: be changed for any other function in the hashlib module.\n    #:\n    #: .. versionchanged:: 0.14\n    default_digest_method = staticmethod(hashlib.sha1)\n\n    #: Controls how the key is derived.  The default is Django style\n    #: concatenation.  Possible values are ``concat``, ``django-concat``\n    #: and ``hmac``.  This is used for deriving a key from the secret key\n    #: with an added salt.\n    #:\n    #: .. versionadded:: 0.14\n    default_key_derivation = 'django-concat'\n\n    def __init__(self, secret_key, salt=None, sep='.', key_derivation=None,\n                 digest_method=None, algorithm=None):\n        self.secret_key = want_bytes(secret_key)\n        self.sep = sep\n        self.salt = 'itsdangerous.Signer' if salt is None else salt\n        if key_derivation is None:\n            key_derivation = self.default_key_derivation\n        self.key_derivation = key_derivation\n        if digest_method is None:\n            digest_method = self.default_digest_method\n        self.digest_method = digest_method\n        if algorithm is None:\n            algorithm = HMACAlgorithm(self.digest_method)\n        self.algorithm = algorithm\n\n    def derive_key(self):\n        \"\"\"This method is called to derive the key.  If you're unhappy with\n        the default key derivation choices you can override them here.\n        Keep in mind that the key derivation in itsdangerous is not intended\n        to be used as a security method to make a complex key out of a short\n        password.  Instead you should use large random secret keys.\n        \"\"\"\n        salt = want_bytes(self.salt)\n        if self.key_derivation == 'concat':\n            return self.digest_method(salt + self.secret_key).digest()\n        elif self.key_derivation == 'django-concat':\n            return self.digest_method(salt + b'signer' +\n                self.secret_key).digest()\n        elif self.key_derivation == 'hmac':\n            mac = hmac.new(self.secret_key, digestmod=self.digest_method)\n            mac.update(salt)\n            return mac.digest()\n        elif self.key_derivation == 'none':\n            return self.secret_key\n        else:\n            raise TypeError('Unknown key derivation method')\n\n    def get_signature(self, value):\n        \"\"\"Returns the signature for the given value\"\"\"\n        value = want_bytes(value)\n        key = self.derive_key()\n        sig = self.algorithm.get_signature(key, value)\n        return base64_encode(sig)\n\n    def sign(self, value):\n        \"\"\"Signs the given string.\"\"\"\n        return value + want_bytes(self.sep) + self.get_signature(value)\n\n    def verify_signature(self, value, sig):\n        \"\"\"Verifies the signature for the given value.\"\"\"\n        key = self.derive_key()\n        try:\n            sig = base64_decode(sig)\n        except Exception:\n            return False\n        return self.algorithm.verify_signature(key, value, sig)\n\n    def unsign(self, signed_value):\n        \"\"\"Unsigns the given string.\"\"\"\n        signed_value = want_bytes(signed_value)\n        sep = want_bytes(self.sep)\n        if sep not in signed_value:\n            raise BadSignature('No %r found in value' % self.sep)\n        value, sig = signed_value.rsplit(sep, 1)\n        if self.verify_signature(value, sig):\n            return value\n        raise BadSignature('Signature %r does not match' % sig,\n                           payload=value)\n\n    def validate(self, signed_value):\n        \"\"\"Just validates the given signed value.  Returns `True` if the\n        signature exists and is valid, `False` otherwise.\"\"\"\n        try:\n            self.unsign(signed_value)\n            return True\n        except BadSignature:\n            return False\n\n\nclass TimestampSigner(Signer):\n    \"\"\"Works like the regular :class:`Signer` but also records the time\n    of the signing and can be used to expire signatures.  The unsign\n    method can rause a :exc:`SignatureExpired` method if the unsigning\n    failed because the signature is expired.  This exception is a subclass\n    of :exc:`BadSignature`.\n    \"\"\"\n\n    def get_timestamp(self):\n        \"\"\"Returns the current timestamp.  This implementation returns the\n        seconds since 1/1/2011.  The function must return an integer.\n        \"\"\"\n        return int(time.time() - EPOCH)\n\n    def timestamp_to_datetime(self, ts):\n        \"\"\"Used to convert the timestamp from `get_timestamp` into a\n        datetime object.\n        \"\"\"\n        return datetime.utcfromtimestamp(ts + EPOCH)\n\n    def sign(self, value):\n        \"\"\"Signs the given string and also attaches a time information.\"\"\"\n        value = want_bytes(value)\n        timestamp = base64_encode(int_to_bytes(self.get_timestamp()))\n        sep = want_bytes(self.sep)\n        value = value + sep + timestamp\n        return value + sep + self.get_signature(value)\n\n    def unsign(self, value, max_age=None, return_timestamp=False):\n        \"\"\"Works like the regular :meth:`~Signer.unsign` but can also\n        validate the time.  See the base docstring of the class for\n        the general behavior.  If `return_timestamp` is set to `True`\n        the timestamp of the signature will be returned as naive\n        :class:`datetime.datetime` object in UTC.\n        \"\"\"\n        try:\n            result = Signer.unsign(self, value)\n            sig_error = None\n        except BadSignature as e:\n            sig_error = e\n            result = e.payload or b''\n        sep = want_bytes(self.sep)\n\n        # If there is no timestamp in the result there is something\n        # seriously wrong.  In case there was a signature error, we raise\n        # that one directly, otherwise we have a weird situation in which\n        # we shouldn't have come except someone uses a time-based serializer\n        # on non-timestamp data, so catch that.\n        if not sep in result:\n            if sig_error:\n                raise sig_error\n            raise BadTimeSignature('timestamp missing', payload=result)\n\n        value, timestamp = result.rsplit(sep, 1)\n        try:\n            timestamp = bytes_to_int(base64_decode(timestamp))\n        except Exception:\n            timestamp = None\n\n        # Signature is *not* okay.  Raise a proper error now that we have\n        # split the value and the timestamp.\n        if sig_error is not None:\n            raise BadTimeSignature(text_type(sig_error), payload=value,\n                                   date_signed=timestamp)\n\n        # Signature was okay but the timestamp is actually not there or\n        # malformed.  Should not happen, but well.  We handle it nonetheless\n        if timestamp is None:\n            raise BadTimeSignature('Malformed timestamp', payload=value)\n\n        # Check timestamp is not older than max_age\n        if max_age is not None:\n            age = self.get_timestamp() - timestamp\n            if age > max_age:\n                raise SignatureExpired(\n                    'Signature age %s > %s seconds' % (age, max_age),\n                    payload=value,\n                    date_signed=self.timestamp_to_datetime(timestamp))\n\n        if return_timestamp:\n            return value, self.timestamp_to_datetime(timestamp)\n        return value\n\n    def validate(self, signed_value, max_age=None):\n        \"\"\"Just validates the given signed value.  Returns `True` if the\n        signature exists and is valid, `False` otherwise.\"\"\"\n        try:\n            self.unsign(signed_value, max_age=max_age)\n            return True\n        except BadSignature:\n            return False\n\n\nclass Serializer(object):\n    \"\"\"This class provides a serialization interface on top of the\n    signer.  It provides a similar API to json/pickle and other modules but is\n    slightly differently structured internally.  If you want to change the\n    underlying implementation for parsing and loading you have to override the\n    :meth:`load_payload` and :meth:`dump_payload` functions.\n\n    This implementation uses simplejson if available for dumping and loading\n    and will fall back to the standard library's json module if it's not\n    available.\n\n    Starting with 0.14 you do not need to subclass this class in order to\n    switch out or customer the :class:`Signer`.  You can instead also pass a\n    different class to the constructor as well as keyword arguments as\n    dictionary that should be forwarded::\n\n        s = Serializer(signer_kwargs={'key_derivation': 'hmac'})\n\n    .. versionchanged:: 0.14:\n       The `signer` and `signer_kwargs` parameters were added to the\n       constructor.\n    \"\"\"\n\n    #: If a serializer module or class is not passed to the constructor\n    #: this one is picked up.  This currently defaults to :mod:`json`.\n    default_serializer = json\n\n    #: The default :class:`Signer` class that is being used by this\n    #: serializer.\n    #:\n    #: .. versionadded:: 0.14\n    default_signer = Signer\n\n    def __init__(self, secret_key, salt=b'itsdangerous', serializer=None,\n                 signer=None, signer_kwargs=None):\n        self.secret_key = want_bytes(secret_key)\n        self.salt = want_bytes(salt)\n        if serializer is None:\n            serializer = self.default_serializer\n        self.serializer = serializer\n        self.is_text_serializer = is_text_serializer(serializer)\n        if signer is None:\n            signer = self.default_signer\n        self.signer = signer\n        self.signer_kwargs = signer_kwargs or {}\n\n    def load_payload(self, payload, serializer=None):\n        \"\"\"Loads the encoded object.  This function raises :class:`BadPayload`\n        if the payload is not valid.  The `serializer` parameter can be used to\n        override the serializer stored on the class.  The encoded payload is\n        always byte based.\n        \"\"\"\n        if serializer is None:\n            serializer = self.serializer\n            is_text = self.is_text_serializer\n        else:\n            is_text = is_text_serializer(serializer)\n        try:\n            if is_text:\n                payload = payload.decode('utf-8')\n            return serializer.loads(payload)\n        except Exception as e:\n            raise BadPayload('Could not load the payload because an '\n                'exception occurred on unserializing the data',\n                original_error=e)\n\n    def dump_payload(self, obj):\n        \"\"\"Dumps the encoded object.  The return value is always a\n        bytestring.  If the internal serializer is text based the value\n        will automatically be encoded to utf-8.\n        \"\"\"\n        return want_bytes(self.serializer.dumps(obj))\n\n    def make_signer(self, salt=None):\n        \"\"\"A method that creates a new instance of the signer to be used.\n        The default implementation uses the :class:`Signer` baseclass.\n        \"\"\"\n        if salt is None:\n            salt = self.salt\n        return self.signer(self.secret_key, salt=salt, **self.signer_kwargs)\n\n    def dumps(self, obj, salt=None):\n        \"\"\"Returns a signed string serialized with the internal serializer.\n        The return value can be either a byte or unicode string depending\n        on the format of the internal serializer.\n        \"\"\"\n        payload = want_bytes(self.dump_payload(obj))\n        rv = self.make_signer(salt).sign(payload)\n        if self.is_text_serializer:\n            rv = rv.decode('utf-8')\n        return rv\n\n    def dump(self, obj, f, salt=None):\n        \"\"\"Like :meth:`dumps` but dumps into a file.  The file handle has\n        to be compatible with what the internal serializer expects.\n        \"\"\"\n        f.write(self.dumps(obj, salt))\n\n    def loads(self, s, salt=None):\n        \"\"\"Reverse of :meth:`dumps`, raises :exc:`BadSignature` if the\n        signature validation fails.\n        \"\"\"\n        s = want_bytes(s)\n        return self.load_payload(self.make_signer(salt).unsign(s))\n\n    def load(self, f, salt=None):\n        \"\"\"Like :meth:`loads` but loads from a file.\"\"\"\n        return self.loads(f.read(), salt)\n\n    def loads_unsafe(self, s, salt=None):\n        \"\"\"Like :meth:`loads` but without verifying the signature.  This is\n        potentially very dangerous to use depending on how your serializer\n        works.  The return value is ``(signature_okay, payload)`` instead of\n        just the payload.  The first item will be a boolean that indicates\n        if the signature is okay (``True``) or if it failed.  This function\n        never fails.\n\n        Use it for debugging only and if you know that your serializer module\n        is not exploitable (eg: do not use it with a pickle serializer).\n\n        .. versionadded:: 0.15\n        \"\"\"\n        return self._loads_unsafe_impl(s, salt)\n\n    def _loads_unsafe_impl(self, s, salt, load_kwargs=None,\n                           load_payload_kwargs=None):\n        \"\"\"Lowlevel helper function to implement :meth:`loads_unsafe` in\n        serializer subclasses.\n        \"\"\"\n        try:\n            return True, self.loads(s, salt=salt, **(load_kwargs or {}))\n        except BadSignature as e:\n            if e.payload is None:\n                return False, None\n            try:\n                return False, self.load_payload(e.payload,\n                    **(load_payload_kwargs or {}))\n            except BadPayload:\n                return False, None\n\n    def load_unsafe(self, f, *args, **kwargs):\n        \"\"\"Like :meth:`loads_unsafe` but loads from a file.\n\n        .. versionadded:: 0.15\n        \"\"\"\n        return self.loads_unsafe(f.read(), *args, **kwargs)\n\n\nclass TimedSerializer(Serializer):\n    \"\"\"Uses the :class:`TimestampSigner` instead of the default\n    :meth:`Signer`.\n    \"\"\"\n\n    default_signer = TimestampSigner\n\n    def loads(self, s, max_age=None, return_timestamp=False, salt=None):\n        \"\"\"Reverse of :meth:`dumps`, raises :exc:`BadSignature` if the\n        signature validation fails.  If a `max_age` is provided it will\n        ensure the signature is not older than that time in seconds.  In\n        case the signature is outdated, :exc:`SignatureExpired` is raised\n        which is a subclass of :exc:`BadSignature`.  All arguments are\n        forwarded to the signer's :meth:`~TimestampSigner.unsign` method.\n        \"\"\"\n        base64d, timestamp = self.make_signer(salt) \\\n            .unsign(s, max_age, return_timestamp=True)\n        payload = self.load_payload(base64d)\n        if return_timestamp:\n            return payload, timestamp\n        return payload\n\n    def loads_unsafe(self, s, max_age=None, salt=None):\n        load_kwargs = {'max_age': max_age}\n        load_payload_kwargs = {}\n        return self._loads_unsafe_impl(s, salt, load_kwargs, load_payload_kwargs)\n\n\nclass JSONWebSignatureSerializer(Serializer):\n    \"\"\"This serializer implements JSON Web Signature (JWS) support.  Only\n    supports the JWS Compact Serialization.\n    \"\"\"\n\n    jws_algorithms = {\n        'HS256': HMACAlgorithm(hashlib.sha256),\n        'HS384': HMACAlgorithm(hashlib.sha384),\n        'HS512': HMACAlgorithm(hashlib.sha512),\n        'none': NoneAlgorithm(),\n    }\n\n    #: The default algorithm to use for signature generation\n    default_algorithm = 'HS256'\n\n    default_serializer = compact_json\n\n    def __init__(self, secret_key, salt=None, serializer=None,\n                 signer=None, signer_kwargs=None, algorithm_name=None):\n        Serializer.__init__(self, secret_key, salt, serializer,\n                            signer, signer_kwargs)\n        if algorithm_name is None:\n            algorithm_name = self.default_algorithm\n        self.algorithm_name = algorithm_name\n        self.algorithm = self.make_algorithm(algorithm_name)\n\n    def load_payload(self, payload, return_header=False):\n        payload = want_bytes(payload)\n        if b'.' not in payload:\n            raise BadPayload('No \".\" found in value')\n        base64d_header, base64d_payload = payload.split(b'.', 1)\n        try:\n            json_header = base64_decode(base64d_header)\n        except Exception as e:\n            raise BadHeader('Could not base64 decode the header because of '\n                'an exception', original_error=e)\n        try:\n            json_payload = base64_decode(base64d_payload)\n        except Exception as e:\n            raise BadPayload('Could not base64 decode the payload because of '\n                'an exception', original_error=e)\n        try:\n            header = Serializer.load_payload(self, json_header,\n                serializer=json)\n        except BadData as e:\n            raise BadHeader('Could not unserialize header because it was '\n                'malformed', original_error=e)\n        if not isinstance(header, dict):\n            raise BadHeader('Header payload is not a JSON object',\n                header=header)\n        payload = Serializer.load_payload(self, json_payload)\n        if return_header:\n            return payload, header\n        return payload\n\n    def dump_payload(self, header, obj):\n        base64d_header = base64_encode(self.serializer.dumps(header))\n        base64d_payload = base64_encode(self.serializer.dumps(obj))\n        return base64d_header + b'.' + base64d_payload\n\n    def make_algorithm(self, algorithm_name):\n        try:\n            return self.jws_algorithms[algorithm_name]\n        except KeyError:\n            raise NotImplementedError('Algorithm not supported')\n\n    def make_signer(self, salt=None, algorithm=None):\n        if salt is None:\n            salt = self.salt\n        key_derivation = 'none' if salt is None else None\n        if algorithm is None:\n            algorithm = self.algorithm\n        return self.signer(self.secret_key, salt=salt, sep='.',\n            key_derivation=key_derivation, algorithm=algorithm)\n\n    def make_header(self, header_fields):\n        header = header_fields.copy() if header_fields else {}\n        header['alg'] = self.algorithm_name\n        return header\n\n    def dumps(self, obj, salt=None, header_fields=None):\n        \"\"\"Like :meth:`~Serializer.dumps` but creates a JSON Web Signature.  It\n        also allows for specifying additional fields to be included in the JWS\n        Header.\n        \"\"\"\n        header = self.make_header(header_fields)\n        signer = self.make_signer(salt, self.algorithm)\n        return signer.sign(self.dump_payload(header, obj))\n\n    def loads(self, s, salt=None, return_header=False):\n        \"\"\"Reverse of :meth:`dumps`. If requested via `return_header` it will\n        return a tuple of payload and header.\n        \"\"\"\n        payload, header = self.load_payload(\n            self.make_signer(salt, self.algorithm).unsign(want_bytes(s)),\n            return_header=True)\n        if header.get('alg') != self.algorithm_name:\n            raise BadHeader('Algorithm mismatch', header=header,\n                            payload=payload)\n        if return_header:\n            return payload, header\n        return payload\n\n    def loads_unsafe(self, s, salt=None, return_header=False):\n        kwargs = {'return_header': return_header}\n        return self._loads_unsafe_impl(s, salt, kwargs, kwargs)\n\n\nclass TimedJSONWebSignatureSerializer(JSONWebSignatureSerializer):\n    \"\"\"Works like the regular :class:`JSONWebSignatureSerializer` but also\n    records the time of the signing and can be used to expire signatures.\n\n    JWS currently does not specify this behavior but it mentions a possibility\n    extension like this in the spec.  Expiry date is encoded into the header\n    similarily as specified in `draft-ietf-oauth-json-web-token\n    <http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html#expDef`_.\n\n    The unsign method can raise a :exc:`SignatureExpired` method if the\n    unsigning failed because the signature is expired.  This exception is a\n    subclass of :exc:`BadSignature`.\n    \"\"\"\n\n    DEFAULT_EXPIRES_IN = 3600\n\n    def __init__(self, secret_key, expires_in=None, **kwargs):\n        JSONWebSignatureSerializer.__init__(self, secret_key, **kwargs)\n        if expires_in is None:\n            expires_in = self.DEFAULT_EXPIRES_IN\n        self.expires_in = expires_in\n\n    def make_header(self, header_fields):\n        header = JSONWebSignatureSerializer.make_header(self, header_fields)\n        iat = self.now()\n        exp = iat + self.expires_in\n        header['iat'] = iat\n        header['exp'] = exp\n        return header\n\n    def loads(self, s, salt=None, return_header=False):\n        payload, header = JSONWebSignatureSerializer.loads(\n            self, s, salt, return_header=True)\n\n        if 'exp' not in header:\n            raise BadSignature('Missing expiry date', payload=payload)\n\n        if not (isinstance(header['exp'], number_types)\n                and header['exp'] > 0):\n            raise BadSignature('expiry date is not an IntDate',\n                               payload=payload)\n\n        if header['exp'] < self.now():\n            raise SignatureExpired('Signature expired', payload=payload,\n                                   date_signed=self.get_issue_date(header))\n\n        if return_header:\n            return payload, header\n        return payload\n\n    def get_issue_date(self, header):\n        rv = header.get('iat')\n        if isinstance(rv, number_types):\n            return datetime.utcfromtimestamp(int(rv))\n\n    def now(self):\n        return int(time.time())\n\n\nclass URLSafeSerializerMixin(object):\n    \"\"\"Mixed in with a regular serializer it will attempt to zlib compress\n    the string to make it shorter if necessary.  It will also base64 encode\n    the string so that it can safely be placed in a URL.\n    \"\"\"\n\n    def load_payload(self, payload):\n        decompress = False\n        if payload.startswith(b'.'):\n            payload = payload[1:]\n            decompress = True\n        try:\n            json = base64_decode(payload)\n        except Exception as e:\n            raise BadPayload('Could not base64 decode the payload because of '\n                'an exception', original_error=e)\n        if decompress:\n            try:\n                json = zlib.decompress(json)\n            except Exception as e:\n                raise BadPayload('Could not zlib decompress the payload before '\n                    'decoding the payload', original_error=e)\n        return super(URLSafeSerializerMixin, self).load_payload(json)\n\n    def dump_payload(self, obj):\n        json = super(URLSafeSerializerMixin, self).dump_payload(obj)\n        is_compressed = False\n        compressed = zlib.compress(json)\n        if len(compressed) < (len(json) - 1):\n            json = compressed\n            is_compressed = True\n        base64d = base64_encode(json)\n        if is_compressed:\n            base64d = b'.' + base64d\n        return base64d\n\n\nclass URLSafeSerializer(URLSafeSerializerMixin, Serializer):\n    \"\"\"Works like :class:`Serializer` but dumps and loads into a URL\n    safe string consisting of the upper and lowercase character of the\n    alphabet as well as ``'_'``, ``'-'`` and ``'.'``.\n    \"\"\"\n    default_serializer = compact_json\n\n\nclass URLSafeTimedSerializer(URLSafeSerializerMixin, TimedSerializer):\n    \"\"\"Works like :class:`TimedSerializer` but dumps and loads into a URL\n    safe string consisting of the upper and lowercase character of the\n    alphabet as well as ``'_'``, ``'-'`` and ``'.'``.\n    \"\"\"\n    default_serializer = compact_json\n"
  },
  {
    "path": "lib/jinja2/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    jinja2\n    ~~~~~~\n\n    Jinja2 is a template engine written in pure Python.  It provides a\n    Django inspired non-XML syntax but supports inline expressions and\n    an optional sandboxed environment.\n\n    Nutshell\n    --------\n\n    Here a small example of a Jinja2 template::\n\n        {% extends 'base.html' %}\n        {% block title %}Memberlist{% endblock %}\n        {% block content %}\n          <ul>\n          {% for user in users %}\n            <li><a href=\"{{ user.url }}\">{{ user.username }}</a></li>\n          {% endfor %}\n          </ul>\n        {% endblock %}\n\n\n    :copyright: (c) 2010 by the Jinja Team.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\n__docformat__ = 'restructuredtext en'\n__version__ = '2.8'\n\n# high level interface\nfrom jinja2.environment import Environment, Template\n\n# loaders\nfrom jinja2.loaders import BaseLoader, FileSystemLoader, PackageLoader, \\\n     DictLoader, FunctionLoader, PrefixLoader, ChoiceLoader, \\\n     ModuleLoader\n\n# bytecode caches\nfrom jinja2.bccache import BytecodeCache, FileSystemBytecodeCache, \\\n     MemcachedBytecodeCache\n\n# undefined types\nfrom jinja2.runtime import Undefined, DebugUndefined, StrictUndefined, \\\n     make_logging_undefined\n\n# exceptions\nfrom jinja2.exceptions import TemplateError, UndefinedError, \\\n     TemplateNotFound, TemplatesNotFound, TemplateSyntaxError, \\\n     TemplateAssertionError\n\n# decorators and public utilities\nfrom jinja2.filters import environmentfilter, contextfilter, \\\n     evalcontextfilter\nfrom jinja2.utils import Markup, escape, clear_caches, \\\n     environmentfunction, evalcontextfunction, contextfunction, \\\n     is_undefined\n\n__all__ = [\n    'Environment', 'Template', 'BaseLoader', 'FileSystemLoader',\n    'PackageLoader', 'DictLoader', 'FunctionLoader', 'PrefixLoader',\n    'ChoiceLoader', 'BytecodeCache', 'FileSystemBytecodeCache',\n    'MemcachedBytecodeCache', 'Undefined', 'DebugUndefined',\n    'StrictUndefined', 'TemplateError', 'UndefinedError', 'TemplateNotFound',\n    'TemplatesNotFound', 'TemplateSyntaxError', 'TemplateAssertionError',\n    'ModuleLoader', 'environmentfilter', 'contextfilter', 'Markup', 'escape',\n    'environmentfunction', 'contextfunction', 'clear_caches', 'is_undefined',\n    'evalcontextfilter', 'evalcontextfunction', 'make_logging_undefined',\n]\n"
  },
  {
    "path": "lib/jinja2/_compat.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    jinja2._compat\n    ~~~~~~~~~~~~~~\n\n    Some py2/py3 compatibility support based on a stripped down\n    version of six so we don't have to depend on a specific version\n    of it.\n\n    :copyright: Copyright 2013 by the Jinja team, see AUTHORS.\n    :license: BSD, see LICENSE for details.\n\"\"\"\nimport sys\n\nPY2 = sys.version_info[0] == 2\nPYPY = hasattr(sys, 'pypy_translation_info')\n_identity = lambda x: x\n\n\nif not PY2:\n    unichr = chr\n    range_type = range\n    text_type = str\n    string_types = (str,)\n    integer_types = (int,)\n\n    iterkeys = lambda d: iter(d.keys())\n    itervalues = lambda d: iter(d.values())\n    iteritems = lambda d: iter(d.items())\n\n    import pickle\n    from io import BytesIO, StringIO\n    NativeStringIO = StringIO\n\n    def reraise(tp, value, tb=None):\n        if value.__traceback__ is not tb:\n            raise value.with_traceback(tb)\n        raise value\n\n    ifilter = filter\n    imap = map\n    izip = zip\n    intern = sys.intern\n\n    implements_iterator = _identity\n    implements_to_string = _identity\n    encode_filename = _identity\n    get_next = lambda x: x.__next__\n\nelse:\n    unichr = unichr\n    text_type = unicode\n    range_type = xrange\n    string_types = (str, unicode)\n    integer_types = (int, long)\n\n    iterkeys = lambda d: d.iterkeys()\n    itervalues = lambda d: d.itervalues()\n    iteritems = lambda d: d.iteritems()\n\n    import cPickle as pickle\n    from cStringIO import StringIO as BytesIO, StringIO\n    NativeStringIO = BytesIO\n\n    exec('def reraise(tp, value, tb=None):\\n raise tp, value, tb')\n\n    from itertools import imap, izip, ifilter\n    intern = intern\n\n    def implements_iterator(cls):\n        cls.next = cls.__next__\n        del cls.__next__\n        return cls\n\n    def implements_to_string(cls):\n        cls.__unicode__ = cls.__str__\n        cls.__str__ = lambda x: x.__unicode__().encode('utf-8')\n        return cls\n\n    get_next = lambda x: x.next\n\n    def encode_filename(filename):\n        if isinstance(filename, unicode):\n            return filename.encode('utf-8')\n        return filename\n\n\ndef with_metaclass(meta, *bases):\n    # This requires a bit of explanation: the basic idea is to make a\n    # dummy metaclass for one level of class instanciation that replaces\n    # itself with the actual metaclass.  Because of internal type checks\n    # we also need to make sure that we downgrade the custom metaclass\n    # for one level to something closer to type (that's why __call__ and\n    # __init__ comes back from type etc.).\n    #\n    # This has the advantage over six.with_metaclass in that it does not\n    # introduce dummy classes into the final MRO.\n    class metaclass(meta):\n        __call__ = type.__call__\n        __init__ = type.__init__\n        def __new__(cls, name, this_bases, d):\n            if this_bases is None:\n                return type.__new__(cls, name, (), d)\n            return meta(name, bases, d)\n    return metaclass('temporary_class', None, {})\n\n\ntry:\n    from urllib.parse import quote_from_bytes as url_quote\nexcept ImportError:\n    from urllib import quote as url_quote\n"
  },
  {
    "path": "lib/jinja2/_stringdefs.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    jinja2._stringdefs\n    ~~~~~~~~~~~~~~~~~~\n\n    Strings of all Unicode characters of a certain category.\n    Used for matching in Unicode-aware languages. Run to regenerate.\n\n    Inspired by chartypes_create.py from the MoinMoin project, original\n    implementation from Pygments.\n\n    :copyright: Copyright 2006-2009 by the Jinja team, see AUTHORS.\n    :license: BSD, see LICENSE for details.\n\"\"\"\n\nfrom jinja2._compat import unichr\n\nCc = u'\\x00\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\t\\n\\x0b\\x0c\\r\\x0e\\x0f\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f\\x7f\\x80\\x81\\x82\\x83\\x84\\x85\\x86\\x87\\x88\\x89\\x8a\\x8b\\x8c\\x8d\\x8e\\x8f\\x90\\x91\\x92\\x93\\x94\\x95\\x96\\x97\\x98\\x99\\x9a\\x9b\\x9c\\x9d\\x9e\\x9f'\n\nCf = u'\\xad\\u0600\\u0601\\u0602\\u0603\\u06dd\\u070f\\u17b4\\u17b5\\u200b\\u200c\\u200d\\u200e\\u200f\\u202a\\u202b\\u202c\\u202d\\u202e\\u2060\\u2061\\u2062\\u2063\\u206a\\u206b\\u206c\\u206d\\u206e\\u206f\\ufeff\\ufff9\\ufffa\\ufffb'\n\nCn = u'\\u0242\\u0243\\u0244\\u0245\\u0246\\u0247\\u0248\\u0249\\u024a\\u024b\\u024c\\u024d\\u024e\\u024f\\u0370\\u0371\\u0372\\u0373\\u0376\\u0377\\u0378\\u0379\\u037b\\u037c\\u037d\\u037f\\u0380\\u0381\\u0382\\u0383\\u038b\\u038d\\u03a2\\u03cf\\u0487\\u04cf\\u04fa\\u04fb\\u04fc\\u04fd\\u04fe\\u04ff\\u0510\\u0511\\u0512\\u0513\\u0514\\u0515\\u0516\\u0517\\u0518\\u0519\\u051a\\u051b\\u051c\\u051d\\u051e\\u051f\\u0520\\u0521\\u0522\\u0523\\u0524\\u0525\\u0526\\u0527\\u0528\\u0529\\u052a\\u052b\\u052c\\u052d\\u052e\\u052f\\u0530\\u0557\\u0558\\u0560\\u0588\\u058b\\u058c\\u058d\\u058e\\u058f\\u0590\\u05ba\\u05c8\\u05c9\\u05ca\\u05cb\\u05cc\\u05cd\\u05ce\\u05cf\\u05eb\\u05ec\\u05ed\\u05ee\\u05ef\\u05f5\\u05f6\\u05f7\\u05f8\\u05f9\\u05fa\\u05fb\\u05fc\\u05fd\\u05fe\\u05ff\\u0604\\u0605\\u0606\\u0607\\u0608\\u0609\\u060a\\u0616\\u0617\\u0618\\u0619\\u061a\\u061c\\u061d\\u0620\\u063b\\u063c\\u063d\\u063e\\u063f\\u065f\\u070e\\u074b\\u074c\\u076e\\u076f\\u0770\\u0771\\u0772\\u0773\\u0774\\u0775\\u0776\\u0777\\u0778\\u0779\\u077a\\u077b\\u077c\\u077d\\u077e\\u077f\\u07b2\\u07b3\\u07b4\\u07b5\\u07b6\\u07b7\\u07b8\\u07b9\\u07ba\\u07bb\\u07bc\\u07bd\\u07be\\u07bf\\u07c0\\u07c1\\u07c2\\u07c3\\u07c4\\u07c5\\u07c6\\u07c7\\u07c8\\u07c9\\u07ca\\u07cb\\u07cc\\u07cd\\u07ce\\u07cf\\u07d0\\u07d1\\u07d2\\u07d3\\u07d4\\u07d5\\u07d6\\u07d7\\u07d8\\u07d9\\u07da\\u07db\\u07dc\\u07dd\\u07de\\u07df\\u07e0\\u07e1\\u07e2\\u07e3\\u07e4\\u07e5\\u07e6\\u07e7\\u07e8\\u07e9\\u07ea\\u07eb\\u07ec\\u07ed\\u07ee\\u07ef\\u07f0\\u07f1\\u07f2\\u07f3\\u07f4\\u07f5\\u07f6\\u07f7\\u07f8\\u07f9\\u07fa\\u07fb\\u07fc\\u07fd\\u07fe\\u07ff\\u0800\\u0801\\u0802\\u0803\\u0804\\u0805\\u0806\\u0807\\u0808\\u0809\\u080a\\u080b\\u080c\\u080d\\u080e\\u080f\\u0810\\u0811\\u0812\\u0813\\u0814\\u0815\\u0816\\u0817\\u0818\\u0819\\u081a\\u081b\\u081c\\u081d\\u081e\\u081f\\u0820\\u0821\\u0822\\u0823\\u0824\\u0825\\u0826\\u0827\\u0828\\u0829\\u082a\\u082b\\u082c\\u082d\\u082e\\u082f\\u0830\\u0831\\u0832\\u0833\\u0834\\u0835\\u0836\\u0837\\u0838\\u0839\\u083a\\u083b\\u083c\\u083d\\u083e\\u083f\\u0840\\u0841\\u0842\\u0843\\u0844\\u0845\\u0846\\u0847\\u0848\\u0849\\u084a\\u084b\\u084c\\u084d\\u084e\\u084f\\u0850\\u0851\\u0852\\u0853\\u0854\\u0855\\u0856\\u0857\\u0858\\u0859\\u085a\\u085b\\u085c\\u085d\\u085e\\u085f\\u0860\\u0861\\u0862\\u0863\\u0864\\u0865\\u0866\\u0867\\u0868\\u0869\\u086a\\u086b\\u086c\\u086d\\u086e\\u086f\\u0870\\u0871\\u0872\\u0873\\u0874\\u0875\\u0876\\u0877\\u0878\\u0879\\u087a\\u087b\\u087c\\u087d\\u087e\\u087f\\u0880\\u0881\\u0882\\u0883\\u0884\\u0885\\u0886\\u0887\\u0888\\u0889\\u088a\\u088b\\u088c\\u088d\\u088e\\u088f\\u0890\\u0891\\u0892\\u0893\\u0894\\u0895\\u0896\\u0897\\u0898\\u0899\\u089a\\u089b\\u089c\\u089d\\u089e\\u089f\\u08a0\\u08a1\\u08a2\\u08a3\\u08a4\\u08a5\\u08a6\\u08a7\\u08a8\\u08a9\\u08aa\\u08ab\\u08ac\\u08ad\\u08ae\\u08af\\u08b0\\u08b1\\u08b2\\u08b3\\u08b4\\u08b5\\u08b6\\u08b7\\u08b8\\u08b9\\u08ba\\u08bb\\u08bc\\u08bd\\u08be\\u08bf\\u08c0\\u08c1\\u08c2\\u08c3\\u08c4\\u08c5\\u08c6\\u08c7\\u08c8\\u08c9\\u08ca\\u08cb\\u08cc\\u08cd\\u08ce\\u08cf\\u08d0\\u08d1\\u08d2\\u08d3\\u08d4\\u08d5\\u08d6\\u08d7\\u08d8\\u08d9\\u08da\\u08db\\u08dc\\u08dd\\u08de\\u08df\\u08e0\\u08e1\\u08e2\\u08e3\\u08e4\\u08e5\\u08e6\\u08e7\\u08e8\\u08e9\\u08ea\\u08eb\\u08ec\\u08ed\\u08ee\\u08ef\\u08f0\\u08f1\\u08f2\\u08f3\\u08f4\\u08f5\\u08f6\\u08f7\\u08f8\\u08f9\\u08fa\\u08fb\\u08fc\\u08fd\\u08fe\\u08ff\\u0900\\u093a\\u093b\\u094e\\u094f\\u0955\\u0956\\u0957\\u0971\\u0972\\u0973\\u0974\\u0975\\u0976\\u0977\\u0978\\u0979\\u097a\\u097b\\u097c\\u097e\\u097f\\u0980\\u0984\\u098d\\u098e\\u0991\\u0992\\u09a9\\u09b1\\u09b3\\u09b4\\u09b5\\u09ba\\u09bb\\u09c5\\u09c6\\u09c9\\u09ca\\u09cf\\u09d0\\u09d1\\u09d2\\u09d3\\u09d4\\u09d5\\u09d6\\u09d8\\u09d9\\u09da\\u09db\\u09de\\u09e4\\u09e5\\u09fb\\u09fc\\u09fd\\u09fe\\u09ff\\u0a00\\u0a04\\u0a0b\\u0a0c\\u0a0d\\u0a0e\\u0a11\\u0a12\\u0a29\\u0a31\\u0a34\\u0a37\\u0a3a\\u0a3b\\u0a3d\\u0a43\\u0a44\\u0a45\\u0a46\\u0a49\\u0a4a\\u0a4e\\u0a4f\\u0a50\\u0a51\\u0a52\\u0a53\\u0a54\\u0a55\\u0a56\\u0a57\\u0a58\\u0a5d\\u0a5f\\u0a60\\u0a61\\u0a62\\u0a63\\u0a64\\u0a65\\u0a75\\u0a76\\u0a77\\u0a78\\u0a79\\u0a7a\\u0a7b\\u0a7c\\u0a7d\\u0a7e\\u0a7f\\u0a80\\u0a84\\u0a8e\\u0a92\\u0aa9\\u0ab1\\u0ab4\\u0aba\\u0abb\\u0ac6\\u0aca\\u0ace\\u0acf\\u0ad1\\u0ad2\\u0ad3\\u0ad4\\u0ad5\\u0ad6\\u0ad7\\u0ad8\\u0ad9\\u0ada\\u0adb\\u0adc\\u0add\\u0ade\\u0adf\\u0ae4\\u0ae5\\u0af0\\u0af2\\u0af3\\u0af4\\u0af5\\u0af6\\u0af7\\u0af8\\u0af9\\u0afa\\u0afb\\u0afc\\u0afd\\u0afe\\u0aff\\u0b00\\u0b04\\u0b0d\\u0b0e\\u0b11\\u0b12\\u0b29\\u0b31\\u0b34\\u0b3a\\u0b3b\\u0b44\\u0b45\\u0b46\\u0b49\\u0b4a\\u0b4e\\u0b4f\\u0b50\\u0b51\\u0b52\\u0b53\\u0b54\\u0b55\\u0b58\\u0b59\\u0b5a\\u0b5b\\u0b5e\\u0b62\\u0b63\\u0b64\\u0b65\\u0b72\\u0b73\\u0b74\\u0b75\\u0b76\\u0b77\\u0b78\\u0b79\\u0b7a\\u0b7b\\u0b7c\\u0b7d\\u0b7e\\u0b7f\\u0b80\\u0b81\\u0b84\\u0b8b\\u0b8c\\u0b8d\\u0b91\\u0b96\\u0b97\\u0b98\\u0b9b\\u0b9d\\u0ba0\\u0ba1\\u0ba2\\u0ba5\\u0ba6\\u0ba7\\u0bab\\u0bac\\u0bad\\u0bba\\u0bbb\\u0bbc\\u0bbd\\u0bc3\\u0bc4\\u0bc5\\u0bc9\\u0bce\\u0bcf\\u0bd0\\u0bd1\\u0bd2\\u0bd3\\u0bd4\\u0bd5\\u0bd6\\u0bd8\\u0bd9\\u0bda\\u0bdb\\u0bdc\\u0bdd\\u0bde\\u0bdf\\u0be0\\u0be1\\u0be2\\u0be3\\u0be4\\u0be5\\u0bfb\\u0bfc\\u0bfd\\u0bfe\\u0bff\\u0c00\\u0c04\\u0c0d\\u0c11\\u0c29\\u0c34\\u0c3a\\u0c3b\\u0c3c\\u0c3d\\u0c45\\u0c49\\u0c4e\\u0c4f\\u0c50\\u0c51\\u0c52\\u0c53\\u0c54\\u0c57\\u0c58\\u0c59\\u0c5a\\u0c5b\\u0c5c\\u0c5d\\u0c5e\\u0c5f\\u0c62\\u0c63\\u0c64\\u0c65\\u0c70\\u0c71\\u0c72\\u0c73\\u0c74\\u0c75\\u0c76\\u0c77\\u0c78\\u0c79\\u0c7a\\u0c7b\\u0c7c\\u0c7d\\u0c7e\\u0c7f\\u0c80\\u0c81\\u0c84\\u0c8d\\u0c91\\u0ca9\\u0cb4\\u0cba\\u0cbb\\u0cc5\\u0cc9\\u0cce\\u0ccf\\u0cd0\\u0cd1\\u0cd2\\u0cd3\\u0cd4\\u0cd7\\u0cd8\\u0cd9\\u0cda\\u0cdb\\u0cdc\\u0cdd\\u0cdf\\u0ce2\\u0ce3\\u0ce4\\u0ce5\\u0cf0\\u0cf1\\u0cf2\\u0cf3\\u0cf4\\u0cf5\\u0cf6\\u0cf7\\u0cf8\\u0cf9\\u0cfa\\u0cfb\\u0cfc\\u0cfd\\u0cfe\\u0cff\\u0d00\\u0d01\\u0d04\\u0d0d\\u0d11\\u0d29\\u0d3a\\u0d3b\\u0d3c\\u0d3d\\u0d44\\u0d45\\u0d49\\u0d4e\\u0d4f\\u0d50\\u0d51\\u0d52\\u0d53\\u0d54\\u0d55\\u0d56\\u0d58\\u0d59\\u0d5a\\u0d5b\\u0d5c\\u0d5d\\u0d5e\\u0d5f\\u0d62\\u0d63\\u0d64\\u0d65\\u0d70\\u0d71\\u0d72\\u0d73\\u0d74\\u0d75\\u0d76\\u0d77\\u0d78\\u0d79\\u0d7a\\u0d7b\\u0d7c\\u0d7d\\u0d7e\\u0d7f\\u0d80\\u0d81\\u0d84\\u0d97\\u0d98\\u0d99\\u0db2\\u0dbc\\u0dbe\\u0dbf\\u0dc7\\u0dc8\\u0dc9\\u0dcb\\u0dcc\\u0dcd\\u0dce\\u0dd5\\u0dd7\\u0de0\\u0de1\\u0de2\\u0de3\\u0de4\\u0de5\\u0de6\\u0de7\\u0de8\\u0de9\\u0dea\\u0deb\\u0dec\\u0ded\\u0dee\\u0def\\u0df0\\u0df1\\u0df5\\u0df6\\u0df7\\u0df8\\u0df9\\u0dfa\\u0dfb\\u0dfc\\u0dfd\\u0dfe\\u0dff\\u0e00\\u0e3b\\u0e3c\\u0e3d\\u0e3e\\u0e5c\\u0e5d\\u0e5e\\u0e5f\\u0e60\\u0e61\\u0e62\\u0e63\\u0e64\\u0e65\\u0e66\\u0e67\\u0e68\\u0e69\\u0e6a\\u0e6b\\u0e6c\\u0e6d\\u0e6e\\u0e6f\\u0e70\\u0e71\\u0e72\\u0e73\\u0e74\\u0e75\\u0e76\\u0e77\\u0e78\\u0e79\\u0e7a\\u0e7b\\u0e7c\\u0e7d\\u0e7e\\u0e7f\\u0e80\\u0e83\\u0e85\\u0e86\\u0e89\\u0e8b\\u0e8c\\u0e8e\\u0e8f\\u0e90\\u0e91\\u0e92\\u0e93\\u0e98\\u0ea0\\u0ea4\\u0ea6\\u0ea8\\u0ea9\\u0eac\\u0eba\\u0ebe\\u0ebf\\u0ec5\\u0ec7\\u0ece\\u0ecf\\u0eda\\u0edb\\u0ede\\u0edf\\u0ee0\\u0ee1\\u0ee2\\u0ee3\\u0ee4\\u0ee5\\u0ee6\\u0ee7\\u0ee8\\u0ee9\\u0eea\\u0eeb\\u0eec\\u0eed\\u0eee\\u0eef\\u0ef0\\u0ef1\\u0ef2\\u0ef3\\u0ef4\\u0ef5\\u0ef6\\u0ef7\\u0ef8\\u0ef9\\u0efa\\u0efb\\u0efc\\u0efd\\u0efe\\u0eff\\u0f48\\u0f6b\\u0f6c\\u0f6d\\u0f6e\\u0f6f\\u0f70\\u0f8c\\u0f8d\\u0f8e\\u0f8f\\u0f98\\u0fbd\\u0fcd\\u0fce\\u0fd2\\u0fd3\\u0fd4\\u0fd5\\u0fd6\\u0fd7\\u0fd8\\u0fd9\\u0fda\\u0fdb\\u0fdc\\u0fdd\\u0fde\\u0fdf\\u0fe0\\u0fe1\\u0fe2\\u0fe3\\u0fe4\\u0fe5\\u0fe6\\u0fe7\\u0fe8\\u0fe9\\u0fea\\u0feb\\u0fec\\u0fed\\u0fee\\u0fef\\u0ff0\\u0ff1\\u0ff2\\u0ff3\\u0ff4\\u0ff5\\u0ff6\\u0ff7\\u0ff8\\u0ff9\\u0ffa\\u0ffb\\u0ffc\\u0ffd\\u0ffe\\u0fff\\u1022\\u1028\\u102b\\u1033\\u1034\\u1035\\u103a\\u103b\\u103c\\u103d\\u103e\\u103f\\u105a\\u105b\\u105c\\u105d\\u105e\\u105f\\u1060\\u1061\\u1062\\u1063\\u1064\\u1065\\u1066\\u1067\\u1068\\u1069\\u106a\\u106b\\u106c\\u106d\\u106e\\u106f\\u1070\\u1071\\u1072\\u1073\\u1074\\u1075\\u1076\\u1077\\u1078\\u1079\\u107a\\u107b\\u107c\\u107d\\u107e\\u107f\\u1080\\u1081\\u1082\\u1083\\u1084\\u1085\\u1086\\u1087\\u1088\\u1089\\u108a\\u108b\\u108c\\u108d\\u108e\\u108f\\u1090\\u1091\\u1092\\u1093\\u1094\\u1095\\u1096\\u1097\\u1098\\u1099\\u109a\\u109b\\u109c\\u109d\\u109e\\u109f\\u10c6\\u10c7\\u10c8\\u10c9\\u10ca\\u10cb\\u10cc\\u10cd\\u10ce\\u10cf\\u10fd\\u10fe\\u10ff\\u115a\\u115b\\u115c\\u115d\\u115e\\u11a3\\u11a4\\u11a5\\u11a6\\u11a7\\u11fa\\u11fb\\u11fc\\u11fd\\u11fe\\u11ff\\u1249\\u124e\\u124f\\u1257\\u1259\\u125e\\u125f\\u1289\\u128e\\u128f\\u12b1\\u12b6\\u12b7\\u12bf\\u12c1\\u12c6\\u12c7\\u12d7\\u1311\\u1316\\u1317\\u135b\\u135c\\u135d\\u135e\\u137d\\u137e\\u137f\\u139a\\u139b\\u139c\\u139d\\u139e\\u139f\\u13f5\\u13f6\\u13f7\\u13f8\\u13f9\\u13fa\\u13fb\\u13fc\\u13fd\\u13fe\\u13ff\\u1400\\u1677\\u1678\\u1679\\u167a\\u167b\\u167c\\u167d\\u167e\\u167f\\u169d\\u169e\\u169f\\u16f1\\u16f2\\u16f3\\u16f4\\u16f5\\u16f6\\u16f7\\u16f8\\u16f9\\u16fa\\u16fb\\u16fc\\u16fd\\u16fe\\u16ff\\u170d\\u1715\\u1716\\u1717\\u1718\\u1719\\u171a\\u171b\\u171c\\u171d\\u171e\\u171f\\u1737\\u1738\\u1739\\u173a\\u173b\\u173c\\u173d\\u173e\\u173f\\u1754\\u1755\\u1756\\u1757\\u1758\\u1759\\u175a\\u175b\\u175c\\u175d\\u175e\\u175f\\u176d\\u1771\\u1774\\u1775\\u1776\\u1777\\u1778\\u1779\\u177a\\u177b\\u177c\\u177d\\u177e\\u177f\\u17de\\u17df\\u17ea\\u17eb\\u17ec\\u17ed\\u17ee\\u17ef\\u17fa\\u17fb\\u17fc\\u17fd\\u17fe\\u17ff\\u180f\\u181a\\u181b\\u181c\\u181d\\u181e\\u181f\\u1878\\u1879\\u187a\\u187b\\u187c\\u187d\\u187e\\u187f\\u18aa\\u18ab\\u18ac\\u18ad\\u18ae\\u18af\\u18b0\\u18b1\\u18b2\\u18b3\\u18b4\\u18b5\\u18b6\\u18b7\\u18b8\\u18b9\\u18ba\\u18bb\\u18bc\\u18bd\\u18be\\u18bf\\u18c0\\u18c1\\u18c2\\u18c3\\u18c4\\u18c5\\u18c6\\u18c7\\u18c8\\u18c9\\u18ca\\u18cb\\u18cc\\u18cd\\u18ce\\u18cf\\u18d0\\u18d1\\u18d2\\u18d3\\u18d4\\u18d5\\u18d6\\u18d7\\u18d8\\u18d9\\u18da\\u18db\\u18dc\\u18dd\\u18de\\u18df\\u18e0\\u18e1\\u18e2\\u18e3\\u18e4\\u18e5\\u18e6\\u18e7\\u18e8\\u18e9\\u18ea\\u18eb\\u18ec\\u18ed\\u18ee\\u18ef\\u18f0\\u18f1\\u18f2\\u18f3\\u18f4\\u18f5\\u18f6\\u18f7\\u18f8\\u18f9\\u18fa\\u18fb\\u18fc\\u18fd\\u18fe\\u18ff\\u191d\\u191e\\u191f\\u192c\\u192d\\u192e\\u192f\\u193c\\u193d\\u193e\\u193f\\u1941\\u1942\\u1943\\u196e\\u196f\\u1975\\u1976\\u1977\\u1978\\u1979\\u197a\\u197b\\u197c\\u197d\\u197e\\u197f\\u19aa\\u19ab\\u19ac\\u19ad\\u19ae\\u19af\\u19ca\\u19cb\\u19cc\\u19cd\\u19ce\\u19cf\\u19da\\u19db\\u19dc\\u19dd\\u1a1c\\u1a1d\\u1a20\\u1a21\\u1a22\\u1a23\\u1a24\\u1a25\\u1a26\\u1a27\\u1a28\\u1a29\\u1a2a\\u1a2b\\u1a2c\\u1a2d\\u1a2e\\u1a2f\\u1a30\\u1a31\\u1a32\\u1a33\\u1a34\\u1a35\\u1a36\\u1a37\\u1a38\\u1a39\\u1a3a\\u1a3b\\u1a3c\\u1a3d\\u1a3e\\u1a3f\\u1a40\\u1a41\\u1a42\\u1a43\\u1a44\\u1a45\\u1a46\\u1a47\\u1a48\\u1a49\\u1a4a\\u1a4b\\u1a4c\\u1a4d\\u1a4e\\u1a4f\\u1a50\\u1a51\\u1a52\\u1a53\\u1a54\\u1a55\\u1a56\\u1a57\\u1a58\\u1a59\\u1a5a\\u1a5b\\u1a5c\\u1a5d\\u1a5e\\u1a5f\\u1a60\\u1a61\\u1a62\\u1a63\\u1a64\\u1a65\\u1a66\\u1a67\\u1a68\\u1a69\\u1a6a\\u1a6b\\u1a6c\\u1a6d\\u1a6e\\u1a6f\\u1a70\\u1a71\\u1a72\\u1a73\\u1a74\\u1a75\\u1a76\\u1a77\\u1a78\\u1a79\\u1a7a\\u1a7b\\u1a7c\\u1a7d\\u1a7e\\u1a7f\\u1a80\\u1a81\\u1a82\\u1a83\\u1a84\\u1a85\\u1a86\\u1a87\\u1a88\\u1a89\\u1a8a\\u1a8b\\u1a8c\\u1a8d\\u1a8e\\u1a8f\\u1a90\\u1a91\\u1a92\\u1a93\\u1a94\\u1a95\\u1a96\\u1a97\\u1a98\\u1a99\\u1a9a\\u1a9b\\u1a9c\\u1a9d\\u1a9e\\u1a9f\\u1aa0\\u1aa1\\u1aa2\\u1aa3\\u1aa4\\u1aa5\\u1aa6\\u1aa7\\u1aa8\\u1aa9\\u1aaa\\u1aab\\u1aac\\u1aad\\u1aae\\u1aaf\\u1ab0\\u1ab1\\u1ab2\\u1ab3\\u1ab4\\u1ab5\\u1ab6\\u1ab7\\u1ab8\\u1ab9\\u1aba\\u1abb\\u1abc\\u1abd\\u1abe\\u1abf\\u1ac0\\u1ac1\\u1ac2\\u1ac3\\u1ac4\\u1ac5\\u1ac6\\u1ac7\\u1ac8\\u1ac9\\u1aca\\u1acb\\u1acc\\u1acd\\u1ace\\u1acf\\u1ad0\\u1ad1\\u1ad2\\u1ad3\\u1ad4\\u1ad5\\u1ad6\\u1ad7\\u1ad8\\u1ad9\\u1ada\\u1adb\\u1adc\\u1add\\u1ade\\u1adf\\u1ae0\\u1ae1\\u1ae2\\u1ae3\\u1ae4\\u1ae5\\u1ae6\\u1ae7\\u1ae8\\u1ae9\\u1aea\\u1aeb\\u1aec\\u1aed\\u1aee\\u1aef\\u1af0\\u1af1\\u1af2\\u1af3\\u1af4\\u1af5\\u1af6\\u1af7\\u1af8\\u1af9\\u1afa\\u1afb\\u1afc\\u1afd\\u1afe\\u1aff\\u1b00\\u1b01\\u1b02\\u1b03\\u1b04\\u1b05\\u1b06\\u1b07\\u1b08\\u1b09\\u1b0a\\u1b0b\\u1b0c\\u1b0d\\u1b0e\\u1b0f\\u1b10\\u1b11\\u1b12\\u1b13\\u1b14\\u1b15\\u1b16\\u1b17\\u1b18\\u1b19\\u1b1a\\u1b1b\\u1b1c\\u1b1d\\u1b1e\\u1b1f\\u1b20\\u1b21\\u1b22\\u1b23\\u1b24\\u1b25\\u1b26\\u1b27\\u1b28\\u1b29\\u1b2a\\u1b2b\\u1b2c\\u1b2d\\u1b2e\\u1b2f\\u1b30\\u1b31\\u1b32\\u1b33\\u1b34\\u1b35\\u1b36\\u1b37\\u1b38\\u1b39\\u1b3a\\u1b3b\\u1b3c\\u1b3d\\u1b3e\\u1b3f\\u1b40\\u1b41\\u1b42\\u1b43\\u1b44\\u1b45\\u1b46\\u1b47\\u1b48\\u1b49\\u1b4a\\u1b4b\\u1b4c\\u1b4d\\u1b4e\\u1b4f\\u1b50\\u1b51\\u1b52\\u1b53\\u1b54\\u1b55\\u1b56\\u1b57\\u1b58\\u1b59\\u1b5a\\u1b5b\\u1b5c\\u1b5d\\u1b5e\\u1b5f\\u1b60\\u1b61\\u1b62\\u1b63\\u1b64\\u1b65\\u1b66\\u1b67\\u1b68\\u1b69\\u1b6a\\u1b6b\\u1b6c\\u1b6d\\u1b6e\\u1b6f\\u1b70\\u1b71\\u1b72\\u1b73\\u1b74\\u1b75\\u1b76\\u1b77\\u1b78\\u1b79\\u1b7a\\u1b7b\\u1b7c\\u1b7d\\u1b7e\\u1b7f\\u1b80\\u1b81\\u1b82\\u1b83\\u1b84\\u1b85\\u1b86\\u1b87\\u1b88\\u1b89\\u1b8a\\u1b8b\\u1b8c\\u1b8d\\u1b8e\\u1b8f\\u1b90\\u1b91\\u1b92\\u1b93\\u1b94\\u1b95\\u1b96\\u1b97\\u1b98\\u1b99\\u1b9a\\u1b9b\\u1b9c\\u1b9d\\u1b9e\\u1b9f\\u1ba0\\u1ba1\\u1ba2\\u1ba3\\u1ba4\\u1ba5\\u1ba6\\u1ba7\\u1ba8\\u1ba9\\u1baa\\u1bab\\u1bac\\u1bad\\u1bae\\u1baf\\u1bb0\\u1bb1\\u1bb2\\u1bb3\\u1bb4\\u1bb5\\u1bb6\\u1bb7\\u1bb8\\u1bb9\\u1bba\\u1bbb\\u1bbc\\u1bbd\\u1bbe\\u1bbf\\u1bc0\\u1bc1\\u1bc2\\u1bc3\\u1bc4\\u1bc5\\u1bc6\\u1bc7\\u1bc8\\u1bc9\\u1bca\\u1bcb\\u1bcc\\u1bcd\\u1bce\\u1bcf\\u1bd0\\u1bd1\\u1bd2\\u1bd3\\u1bd4\\u1bd5\\u1bd6\\u1bd7\\u1bd8\\u1bd9\\u1bda\\u1bdb\\u1bdc\\u1bdd\\u1bde\\u1bdf\\u1be0\\u1be1\\u1be2\\u1be3\\u1be4\\u1be5\\u1be6\\u1be7\\u1be8\\u1be9\\u1bea\\u1beb\\u1bec\\u1bed\\u1bee\\u1bef\\u1bf0\\u1bf1\\u1bf2\\u1bf3\\u1bf4\\u1bf5\\u1bf6\\u1bf7\\u1bf8\\u1bf9\\u1bfa\\u1bfb\\u1bfc\\u1bfd\\u1bfe\\u1bff\\u1c00\\u1c01\\u1c02\\u1c03\\u1c04\\u1c05\\u1c06\\u1c07\\u1c08\\u1c09\\u1c0a\\u1c0b\\u1c0c\\u1c0d\\u1c0e\\u1c0f\\u1c10\\u1c11\\u1c12\\u1c13\\u1c14\\u1c15\\u1c16\\u1c17\\u1c18\\u1c19\\u1c1a\\u1c1b\\u1c1c\\u1c1d\\u1c1e\\u1c1f\\u1c20\\u1c21\\u1c22\\u1c23\\u1c24\\u1c25\\u1c26\\u1c27\\u1c28\\u1c29\\u1c2a\\u1c2b\\u1c2c\\u1c2d\\u1c2e\\u1c2f\\u1c30\\u1c31\\u1c32\\u1c33\\u1c34\\u1c35\\u1c36\\u1c37\\u1c38\\u1c39\\u1c3a\\u1c3b\\u1c3c\\u1c3d\\u1c3e\\u1c3f\\u1c40\\u1c41\\u1c42\\u1c43\\u1c44\\u1c45\\u1c46\\u1c47\\u1c48\\u1c49\\u1c4a\\u1c4b\\u1c4c\\u1c4d\\u1c4e\\u1c4f\\u1c50\\u1c51\\u1c52\\u1c53\\u1c54\\u1c55\\u1c56\\u1c57\\u1c58\\u1c59\\u1c5a\\u1c5b\\u1c5c\\u1c5d\\u1c5e\\u1c5f\\u1c60\\u1c61\\u1c62\\u1c63\\u1c64\\u1c65\\u1c66\\u1c67\\u1c68\\u1c69\\u1c6a\\u1c6b\\u1c6c\\u1c6d\\u1c6e\\u1c6f\\u1c70\\u1c71\\u1c72\\u1c73\\u1c74\\u1c75\\u1c76\\u1c77\\u1c78\\u1c79\\u1c7a\\u1c7b\\u1c7c\\u1c7d\\u1c7e\\u1c7f\\u1c80\\u1c81\\u1c82\\u1c83\\u1c84\\u1c85\\u1c86\\u1c87\\u1c88\\u1c89\\u1c8a\\u1c8b\\u1c8c\\u1c8d\\u1c8e\\u1c8f\\u1c90\\u1c91\\u1c92\\u1c93\\u1c94\\u1c95\\u1c96\\u1c97\\u1c98\\u1c99\\u1c9a\\u1c9b\\u1c9c\\u1c9d\\u1c9e\\u1c9f\\u1ca0\\u1ca1\\u1ca2\\u1ca3\\u1ca4\\u1ca5\\u1ca6\\u1ca7\\u1ca8\\u1ca9\\u1caa\\u1cab\\u1cac\\u1cad\\u1cae\\u1caf\\u1cb0\\u1cb1\\u1cb2\\u1cb3\\u1cb4\\u1cb5\\u1cb6\\u1cb7\\u1cb8\\u1cb9\\u1cba\\u1cbb\\u1cbc\\u1cbd\\u1cbe\\u1cbf\\u1cc0\\u1cc1\\u1cc2\\u1cc3\\u1cc4\\u1cc5\\u1cc6\\u1cc7\\u1cc8\\u1cc9\\u1cca\\u1ccb\\u1ccc\\u1ccd\\u1cce\\u1ccf\\u1cd0\\u1cd1\\u1cd2\\u1cd3\\u1cd4\\u1cd5\\u1cd6\\u1cd7\\u1cd8\\u1cd9\\u1cda\\u1cdb\\u1cdc\\u1cdd\\u1cde\\u1cdf\\u1ce0\\u1ce1\\u1ce2\\u1ce3\\u1ce4\\u1ce5\\u1ce6\\u1ce7\\u1ce8\\u1ce9\\u1cea\\u1ceb\\u1cec\\u1ced\\u1cee\\u1cef\\u1cf0\\u1cf1\\u1cf2\\u1cf3\\u1cf4\\u1cf5\\u1cf6\\u1cf7\\u1cf8\\u1cf9\\u1cfa\\u1cfb\\u1cfc\\u1cfd\\u1cfe\\u1cff\\u1dc4\\u1dc5\\u1dc6\\u1dc7\\u1dc8\\u1dc9\\u1dca\\u1dcb\\u1dcc\\u1dcd\\u1dce\\u1dcf\\u1dd0\\u1dd1\\u1dd2\\u1dd3\\u1dd4\\u1dd5\\u1dd6\\u1dd7\\u1dd8\\u1dd9\\u1dda\\u1ddb\\u1ddc\\u1ddd\\u1dde\\u1ddf\\u1de0\\u1de1\\u1de2\\u1de3\\u1de4\\u1de5\\u1de6\\u1de7\\u1de8\\u1de9\\u1dea\\u1deb\\u1dec\\u1ded\\u1dee\\u1def\\u1df0\\u1df1\\u1df2\\u1df3\\u1df4\\u1df5\\u1df6\\u1df7\\u1df8\\u1df9\\u1dfa\\u1dfb\\u1dfc\\u1dfd\\u1dfe\\u1dff\\u1e9c\\u1e9d\\u1e9e\\u1e9f\\u1efa\\u1efb\\u1efc\\u1efd\\u1efe\\u1eff\\u1f16\\u1f17\\u1f1e\\u1f1f\\u1f46\\u1f47\\u1f4e\\u1f4f\\u1f58\\u1f5a\\u1f5c\\u1f5e\\u1f7e\\u1f7f\\u1fb5\\u1fc5\\u1fd4\\u1fd5\\u1fdc\\u1ff0\\u1ff1\\u1ff5\\u1fff\\u2064\\u2065\\u2066\\u2067\\u2068\\u2069\\u2072\\u2073\\u208f\\u2095\\u2096\\u2097\\u2098\\u2099\\u209a\\u209b\\u209c\\u209d\\u209e\\u209f\\u20b6\\u20b7\\u20b8\\u20b9\\u20ba\\u20bb\\u20bc\\u20bd\\u20be\\u20bf\\u20c0\\u20c1\\u20c2\\u20c3\\u20c4\\u20c5\\u20c6\\u20c7\\u20c8\\u20c9\\u20ca\\u20cb\\u20cc\\u20cd\\u20ce\\u20cf\\u20ec\\u20ed\\u20ee\\u20ef\\u20f0\\u20f1\\u20f2\\u20f3\\u20f4\\u20f5\\u20f6\\u20f7\\u20f8\\u20f9\\u20fa\\u20fb\\u20fc\\u20fd\\u20fe\\u20ff\\u214d\\u214e\\u214f\\u2150\\u2151\\u2152\\u2184\\u2185\\u2186\\u2187\\u2188\\u2189\\u218a\\u218b\\u218c\\u218d\\u218e\\u218f\\u23dc\\u23dd\\u23de\\u23df\\u23e0\\u23e1\\u23e2\\u23e3\\u23e4\\u23e5\\u23e6\\u23e7\\u23e8\\u23e9\\u23ea\\u23eb\\u23ec\\u23ed\\u23ee\\u23ef\\u23f0\\u23f1\\u23f2\\u23f3\\u23f4\\u23f5\\u23f6\\u23f7\\u23f8\\u23f9\\u23fa\\u23fb\\u23fc\\u23fd\\u23fe\\u23ff\\u2427\\u2428\\u2429\\u242a\\u242b\\u242c\\u242d\\u242e\\u242f\\u2430\\u2431\\u2432\\u2433\\u2434\\u2435\\u2436\\u2437\\u2438\\u2439\\u243a\\u243b\\u243c\\u243d\\u243e\\u243f\\u244b\\u244c\\u244d\\u244e\\u244f\\u2450\\u2451\\u2452\\u2453\\u2454\\u2455\\u2456\\u2457\\u2458\\u2459\\u245a\\u245b\\u245c\\u245d\\u245e\\u245f\\u269d\\u269e\\u269f\\u26b2\\u26b3\\u26b4\\u26b5\\u26b6\\u26b7\\u26b8\\u26b9\\u26ba\\u26bb\\u26bc\\u26bd\\u26be\\u26bf\\u26c0\\u26c1\\u26c2\\u26c3\\u26c4\\u26c5\\u26c6\\u26c7\\u26c8\\u26c9\\u26ca\\u26cb\\u26cc\\u26cd\\u26ce\\u26cf\\u26d0\\u26d1\\u26d2\\u26d3\\u26d4\\u26d5\\u26d6\\u26d7\\u26d8\\u26d9\\u26da\\u26db\\u26dc\\u26dd\\u26de\\u26df\\u26e0\\u26e1\\u26e2\\u26e3\\u26e4\\u26e5\\u26e6\\u26e7\\u26e8\\u26e9\\u26ea\\u26eb\\u26ec\\u26ed\\u26ee\\u26ef\\u26f0\\u26f1\\u26f2\\u26f3\\u26f4\\u26f5\\u26f6\\u26f7\\u26f8\\u26f9\\u26fa\\u26fb\\u26fc\\u26fd\\u26fe\\u26ff\\u2700\\u2705\\u270a\\u270b\\u2728\\u274c\\u274e\\u2753\\u2754\\u2755\\u2757\\u275f\\u2760\\u2795\\u2796\\u2797\\u27b0\\u27bf\\u27c7\\u27c8\\u27c9\\u27ca\\u27cb\\u27cc\\u27cd\\u27ce\\u27cf\\u27ec\\u27ed\\u27ee\\u27ef\\u2b14\\u2b15\\u2b16\\u2b17\\u2b18\\u2b19\\u2b1a\\u2b1b\\u2b1c\\u2b1d\\u2b1e\\u2b1f\\u2b20\\u2b21\\u2b22\\u2b23\\u2b24\\u2b25\\u2b26\\u2b27\\u2b28\\u2b29\\u2b2a\\u2b2b\\u2b2c\\u2b2d\\u2b2e\\u2b2f\\u2b30\\u2b31\\u2b32\\u2b33\\u2b34\\u2b35\\u2b36\\u2b37\\u2b38\\u2b39\\u2b3a\\u2b3b\\u2b3c\\u2b3d\\u2b3e\\u2b3f\\u2b40\\u2b41\\u2b42\\u2b43\\u2b44\\u2b45\\u2b46\\u2b47\\u2b48\\u2b49\\u2b4a\\u2b4b\\u2b4c\\u2b4d\\u2b4e\\u2b4f\\u2b50\\u2b51\\u2b52\\u2b53\\u2b54\\u2b55\\u2b56\\u2b57\\u2b58\\u2b59\\u2b5a\\u2b5b\\u2b5c\\u2b5d\\u2b5e\\u2b5f\\u2b60\\u2b61\\u2b62\\u2b63\\u2b64\\u2b65\\u2b66\\u2b67\\u2b68\\u2b69\\u2b6a\\u2b6b\\u2b6c\\u2b6d\\u2b6e\\u2b6f\\u2b70\\u2b71\\u2b72\\u2b73\\u2b74\\u2b75\\u2b76\\u2b77\\u2b78\\u2b79\\u2b7a\\u2b7b\\u2b7c\\u2b7d\\u2b7e\\u2b7f\\u2b80\\u2b81\\u2b82\\u2b83\\u2b84\\u2b85\\u2b86\\u2b87\\u2b88\\u2b89\\u2b8a\\u2b8b\\u2b8c\\u2b8d\\u2b8e\\u2b8f\\u2b90\\u2b91\\u2b92\\u2b93\\u2b94\\u2b95\\u2b96\\u2b97\\u2b98\\u2b99\\u2b9a\\u2b9b\\u2b9c\\u2b9d\\u2b9e\\u2b9f\\u2ba0\\u2ba1\\u2ba2\\u2ba3\\u2ba4\\u2ba5\\u2ba6\\u2ba7\\u2ba8\\u2ba9\\u2baa\\u2bab\\u2bac\\u2bad\\u2bae\\u2baf\\u2bb0\\u2bb1\\u2bb2\\u2bb3\\u2bb4\\u2bb5\\u2bb6\\u2bb7\\u2bb8\\u2bb9\\u2bba\\u2bbb\\u2bbc\\u2bbd\\u2bbe\\u2bbf\\u2bc0\\u2bc1\\u2bc2\\u2bc3\\u2bc4\\u2bc5\\u2bc6\\u2bc7\\u2bc8\\u2bc9\\u2bca\\u2bcb\\u2bcc\\u2bcd\\u2bce\\u2bcf\\u2bd0\\u2bd1\\u2bd2\\u2bd3\\u2bd4\\u2bd5\\u2bd6\\u2bd7\\u2bd8\\u2bd9\\u2bda\\u2bdb\\u2bdc\\u2bdd\\u2bde\\u2bdf\\u2be0\\u2be1\\u2be2\\u2be3\\u2be4\\u2be5\\u2be6\\u2be7\\u2be8\\u2be9\\u2bea\\u2beb\\u2bec\\u2bed\\u2bee\\u2bef\\u2bf0\\u2bf1\\u2bf2\\u2bf3\\u2bf4\\u2bf5\\u2bf6\\u2bf7\\u2bf8\\u2bf9\\u2bfa\\u2bfb\\u2bfc\\u2bfd\\u2bfe\\u2bff\\u2c2f\\u2c5f\\u2c60\\u2c61\\u2c62\\u2c63\\u2c64\\u2c65\\u2c66\\u2c67\\u2c68\\u2c69\\u2c6a\\u2c6b\\u2c6c\\u2c6d\\u2c6e\\u2c6f\\u2c70\\u2c71\\u2c72\\u2c73\\u2c74\\u2c75\\u2c76\\u2c77\\u2c78\\u2c79\\u2c7a\\u2c7b\\u2c7c\\u2c7d\\u2c7e\\u2c7f\\u2ceb\\u2cec\\u2ced\\u2cee\\u2cef\\u2cf0\\u2cf1\\u2cf2\\u2cf3\\u2cf4\\u2cf5\\u2cf6\\u2cf7\\u2cf8\\u2d26\\u2d27\\u2d28\\u2d29\\u2d2a\\u2d2b\\u2d2c\\u2d2d\\u2d2e\\u2d2f\\u2d66\\u2d67\\u2d68\\u2d69\\u2d6a\\u2d6b\\u2d6c\\u2d6d\\u2d6e\\u2d70\\u2d71\\u2d72\\u2d73\\u2d74\\u2d75\\u2d76\\u2d77\\u2d78\\u2d79\\u2d7a\\u2d7b\\u2d7c\\u2d7d\\u2d7e\\u2d7f\\u2d97\\u2d98\\u2d99\\u2d9a\\u2d9b\\u2d9c\\u2d9d\\u2d9e\\u2d9f\\u2da7\\u2daf\\u2db7\\u2dbf\\u2dc7\\u2dcf\\u2dd7\\u2ddf\\u2de0\\u2de1\\u2de2\\u2de3\\u2de4\\u2de5\\u2de6\\u2de7\\u2de8\\u2de9\\u2dea\\u2deb\\u2dec\\u2ded\\u2dee\\u2def\\u2df0\\u2df1\\u2df2\\u2df3\\u2df4\\u2df5\\u2df6\\u2df7\\u2df8\\u2df9\\u2dfa\\u2dfb\\u2dfc\\u2dfd\\u2dfe\\u2dff\\u2e18\\u2e19\\u2e1a\\u2e1b\\u2e1e\\u2e1f\\u2e20\\u2e21\\u2e22\\u2e23\\u2e24\\u2e25\\u2e26\\u2e27\\u2e28\\u2e29\\u2e2a\\u2e2b\\u2e2c\\u2e2d\\u2e2e\\u2e2f\\u2e30\\u2e31\\u2e32\\u2e33\\u2e34\\u2e35\\u2e36\\u2e37\\u2e38\\u2e39\\u2e3a\\u2e3b\\u2e3c\\u2e3d\\u2e3e\\u2e3f\\u2e40\\u2e41\\u2e42\\u2e43\\u2e44\\u2e45\\u2e46\\u2e47\\u2e48\\u2e49\\u2e4a\\u2e4b\\u2e4c\\u2e4d\\u2e4e\\u2e4f\\u2e50\\u2e51\\u2e52\\u2e53\\u2e54\\u2e55\\u2e56\\u2e57\\u2e58\\u2e59\\u2e5a\\u2e5b\\u2e5c\\u2e5d\\u2e5e\\u2e5f\\u2e60\\u2e61\\u2e62\\u2e63\\u2e64\\u2e65\\u2e66\\u2e67\\u2e68\\u2e69\\u2e6a\\u2e6b\\u2e6c\\u2e6d\\u2e6e\\u2e6f\\u2e70\\u2e71\\u2e72\\u2e73\\u2e74\\u2e75\\u2e76\\u2e77\\u2e78\\u2e79\\u2e7a\\u2e7b\\u2e7c\\u2e7d\\u2e7e\\u2e7f\\u2e9a\\u2ef4\\u2ef5\\u2ef6\\u2ef7\\u2ef8\\u2ef9\\u2efa\\u2efb\\u2efc\\u2efd\\u2efe\\u2eff\\u2fd6\\u2fd7\\u2fd8\\u2fd9\\u2fda\\u2fdb\\u2fdc\\u2fdd\\u2fde\\u2fdf\\u2fe0\\u2fe1\\u2fe2\\u2fe3\\u2fe4\\u2fe5\\u2fe6\\u2fe7\\u2fe8\\u2fe9\\u2fea\\u2feb\\u2fec\\u2fed\\u2fee\\u2fef\\u2ffc\\u2ffd\\u2ffe\\u2fff\\u3040\\u3097\\u3098\\u3100\\u3101\\u3102\\u3103\\u3104\\u312d\\u312e\\u312f\\u3130\\u318f\\u31b8\\u31b9\\u31ba\\u31bb\\u31bc\\u31bd\\u31be\\u31bf\\u31d0\\u31d1\\u31d2\\u31d3\\u31d4\\u31d5\\u31d6\\u31d7\\u31d8\\u31d9\\u31da\\u31db\\u31dc\\u31dd\\u31de\\u31df\\u31e0\\u31e1\\u31e2\\u31e3\\u31e4\\u31e5\\u31e6\\u31e7\\u31e8\\u31e9\\u31ea\\u31eb\\u31ec\\u31ed\\u31ee\\u31ef\\u321f\\u3244\\u3245\\u3246\\u3247\\u3248\\u3249\\u324a\\u324b\\u324c\\u324d\\u324e\\u324f\\u32ff\\u4db6\\u4db7\\u4db8\\u4db9\\u4dba\\u4dbb\\u4dbc\\u4dbd\\u4dbe\\u4dbf\\u9fbc\\u9fbd\\u9fbe\\u9fbf\\u9fc0\\u9fc1\\u9fc2\\u9fc3\\u9fc4\\u9fc5\\u9fc6\\u9fc7\\u9fc8\\u9fc9\\u9fca\\u9fcb\\u9fcc\\u9fcd\\u9fce\\u9fcf\\u9fd0\\u9fd1\\u9fd2\\u9fd3\\u9fd4\\u9fd5\\u9fd6\\u9fd7\\u9fd8\\u9fd9\\u9fda\\u9fdb\\u9fdc\\u9fdd\\u9fde\\u9fdf\\u9fe0\\u9fe1\\u9fe2\\u9fe3\\u9fe4\\u9fe5\\u9fe6\\u9fe7\\u9fe8\\u9fe9\\u9fea\\u9feb\\u9fec\\u9fed\\u9fee\\u9fef\\u9ff0\\u9ff1\\u9ff2\\u9ff3\\u9ff4\\u9ff5\\u9ff6\\u9ff7\\u9ff8\\u9ff9\\u9ffa\\u9ffb\\u9ffc\\u9ffd\\u9ffe\\u9fff\\ua48d\\ua48e\\ua48f\\ua4c7\\ua4c8\\ua4c9\\ua4ca\\ua4cb\\ua4cc\\ua4cd\\ua4ce\\ua4cf\\ua4d0\\ua4d1\\ua4d2\\ua4d3\\ua4d4\\ua4d5\\ua4d6\\ua4d7\\ua4d8\\ua4d9\\ua4da\\ua4db\\ua4dc\\ua4dd\\ua4de\\ua4df\\ua4e0\\ua4e1\\ua4e2\\ua4e3\\ua4e4\\ua4e5\\ua4e6\\ua4e7\\ua4e8\\ua4e9\\ua4ea\\ua4eb\\ua4ec\\ua4ed\\ua4ee\\ua4ef\\ua4f0\\ua4f1\\ua4f2\\ua4f3\\ua4f4\\ua4f5\\ua4f6\\ua4f7\\ua4f8\\ua4f9\\ua4fa\\ua4fb\\ua4fc\\ua4fd\\ua4fe\\ua4ff\\ua500\\ua501\\ua502\\ua503\\ua504\\ua505\\ua506\\ua507\\ua508\\ua509\\ua50a\\ua50b\\ua50c\\ua50d\\ua50e\\ua50f\\ua510\\ua511\\ua512\\ua513\\ua514\\ua515\\ua516\\ua517\\ua518\\ua519\\ua51a\\ua51b\\ua51c\\ua51d\\ua51e\\ua51f\\ua520\\ua521\\ua522\\ua523\\ua524\\ua525\\ua526\\ua527\\ua528\\ua529\\ua52a\\ua52b\\ua52c\\ua52d\\ua52e\\ua52f\\ua530\\ua531\\ua532\\ua533\\ua534\\ua535\\ua536\\ua537\\ua538\\ua539\\ua53a\\ua53b\\ua53c\\ua53d\\ua53e\\ua53f\\ua540\\ua541\\ua542\\ua543\\ua544\\ua545\\ua546\\ua547\\ua548\\ua549\\ua54a\\ua54b\\ua54c\\ua54d\\ua54e\\ua54f\\ua550\\ua551\\ua552\\ua553\\ua554\\ua555\\ua556\\ua557\\ua558\\ua559\\ua55a\\ua55b\\ua55c\\ua55d\\ua55e\\ua55f\\ua560\\ua561\\ua562\\ua563\\ua564\\ua565\\ua566\\ua567\\ua568\\ua569\\ua56a\\ua56b\\ua56c\\ua56d\\ua56e\\ua56f\\ua570\\ua571\\ua572\\ua573\\ua574\\ua575\\ua576\\ua577\\ua578\\ua579\\ua57a\\ua57b\\ua57c\\ua57d\\ua57e\\ua57f\\ua580\\ua581\\ua582\\ua583\\ua584\\ua585\\ua586\\ua587\\ua588\\ua589\\ua58a\\ua58b\\ua58c\\ua58d\\ua58e\\ua58f\\ua590\\ua591\\ua592\\ua593\\ua594\\ua595\\ua596\\ua597\\ua598\\ua599\\ua59a\\ua59b\\ua59c\\ua59d\\ua59e\\ua59f\\ua5a0\\ua5a1\\ua5a2\\ua5a3\\ua5a4\\ua5a5\\ua5a6\\ua5a7\\ua5a8\\ua5a9\\ua5aa\\ua5ab\\ua5ac\\ua5ad\\ua5ae\\ua5af\\ua5b0\\ua5b1\\ua5b2\\ua5b3\\ua5b4\\ua5b5\\ua5b6\\ua5b7\\ua5b8\\ua5b9\\ua5ba\\ua5bb\\ua5bc\\ua5bd\\ua5be\\ua5bf\\ua5c0\\ua5c1\\ua5c2\\ua5c3\\ua5c4\\ua5c5\\ua5c6\\ua5c7\\ua5c8\\ua5c9\\ua5ca\\ua5cb\\ua5cc\\ua5cd\\ua5ce\\ua5cf\\ua5d0\\ua5d1\\ua5d2\\ua5d3\\ua5d4\\ua5d5\\ua5d6\\ua5d7\\ua5d8\\ua5d9\\ua5da\\ua5db\\ua5dc\\ua5dd\\ua5de\\ua5df\\ua5e0\\ua5e1\\ua5e2\\ua5e3\\ua5e4\\ua5e5\\ua5e6\\ua5e7\\ua5e8\\ua5e9\\ua5ea\\ua5eb\\ua5ec\\ua5ed\\ua5ee\\ua5ef\\ua5f0\\ua5f1\\ua5f2\\ua5f3\\ua5f4\\ua5f5\\ua5f6\\ua5f7\\ua5f8\\ua5f9\\ua5fa\\ua5fb\\ua5fc\\ua5fd\\ua5fe\\ua5ff\\ua600\\ua601\\ua602\\ua603\\ua604\\ua605\\ua606\\ua607\\ua608\\ua609\\ua60a\\ua60b\\ua60c\\ua60d\\ua60e\\ua60f\\ua610\\ua611\\ua612\\ua613\\ua614\\ua615\\ua616\\ua617\\ua618\\ua619\\ua61a\\ua61b\\ua61c\\ua61d\\ua61e\\ua61f\\ua620\\ua621\\ua622\\ua623\\ua624\\ua625\\ua626\\ua627\\ua628\\ua629\\ua62a\\ua62b\\ua62c\\ua62d\\ua62e\\ua62f\\ua630\\ua631\\ua632\\ua633\\ua634\\ua635\\ua636\\ua637\\ua638\\ua639\\ua63a\\ua63b\\ua63c\\ua63d\\ua63e\\ua63f\\ua640\\ua641\\ua642\\ua643\\ua644\\ua645\\ua646\\ua647\\ua648\\ua649\\ua64a\\ua64b\\ua64c\\ua64d\\ua64e\\ua64f\\ua650\\ua651\\ua652\\ua653\\ua654\\ua655\\ua656\\ua657\\ua658\\ua659\\ua65a\\ua65b\\ua65c\\ua65d\\ua65e\\ua65f\\ua660\\ua661\\ua662\\ua663\\ua664\\ua665\\ua666\\ua667\\ua668\\ua669\\ua66a\\ua66b\\ua66c\\ua66d\\ua66e\\ua66f\\ua670\\ua671\\ua672\\ua673\\ua674\\ua675\\ua676\\ua677\\ua678\\ua679\\ua67a\\ua67b\\ua67c\\ua67d\\ua67e\\ua67f\\ua680\\ua681\\ua682\\ua683\\ua684\\ua685\\ua686\\ua687\\ua688\\ua689\\ua68a\\ua68b\\ua68c\\ua68d\\ua68e\\ua68f\\ua690\\ua691\\ua692\\ua693\\ua694\\ua695\\ua696\\ua697\\ua698\\ua699\\ua69a\\ua69b\\ua69c\\ua69d\\ua69e\\ua69f\\ua6a0\\ua6a1\\ua6a2\\ua6a3\\ua6a4\\ua6a5\\ua6a6\\ua6a7\\ua6a8\\ua6a9\\ua6aa\\ua6ab\\ua6ac\\ua6ad\\ua6ae\\ua6af\\ua6b0\\ua6b1\\ua6b2\\ua6b3\\ua6b4\\ua6b5\\ua6b6\\ua6b7\\ua6b8\\ua6b9\\ua6ba\\ua6bb\\ua6bc\\ua6bd\\ua6be\\ua6bf\\ua6c0\\ua6c1\\ua6c2\\ua6c3\\ua6c4\\ua6c5\\ua6c6\\ua6c7\\ua6c8\\ua6c9\\ua6ca\\ua6cb\\ua6cc\\ua6cd\\ua6ce\\ua6cf\\ua6d0\\ua6d1\\ua6d2\\ua6d3\\ua6d4\\ua6d5\\ua6d6\\ua6d7\\ua6d8\\ua6d9\\ua6da\\ua6db\\ua6dc\\ua6dd\\ua6de\\ua6df\\ua6e0\\ua6e1\\ua6e2\\ua6e3\\ua6e4\\ua6e5\\ua6e6\\ua6e7\\ua6e8\\ua6e9\\ua6ea\\ua6eb\\ua6ec\\ua6ed\\ua6ee\\ua6ef\\ua6f0\\ua6f1\\ua6f2\\ua6f3\\ua6f4\\ua6f5\\ua6f6\\ua6f7\\ua6f8\\ua6f9\\ua6fa\\ua6fb\\ua6fc\\ua6fd\\ua6fe\\ua6ff\\ua717\\ua718\\ua719\\ua71a\\ua71b\\ua71c\\ua71d\\ua71e\\ua71f\\ua720\\ua721\\ua722\\ua723\\ua724\\ua725\\ua726\\ua727\\ua728\\ua729\\ua72a\\ua72b\\ua72c\\ua72d\\ua72e\\ua72f\\ua730\\ua731\\ua732\\ua733\\ua734\\ua735\\ua736\\ua737\\ua738\\ua739\\ua73a\\ua73b\\ua73c\\ua73d\\ua73e\\ua73f\\ua740\\ua741\\ua742\\ua743\\ua744\\ua745\\ua746\\ua747\\ua748\\ua749\\ua74a\\ua74b\\ua74c\\ua74d\\ua74e\\ua74f\\ua750\\ua751\\ua752\\ua753\\ua754\\ua755\\ua756\\ua757\\ua758\\ua759\\ua75a\\ua75b\\ua75c\\ua75d\\ua75e\\ua75f\\ua760\\ua761\\ua762\\ua763\\ua764\\ua765\\ua766\\ua767\\ua768\\ua769\\ua76a\\ua76b\\ua76c\\ua76d\\ua76e\\ua76f\\ua770\\ua771\\ua772\\ua773\\ua774\\ua775\\ua776\\ua777\\ua778\\ua779\\ua77a\\ua77b\\ua77c\\ua77d\\ua77e\\ua77f\\ua780\\ua781\\ua782\\ua783\\ua784\\ua785\\ua786\\ua787\\ua788\\ua789\\ua78a\\ua78b\\ua78c\\ua78d\\ua78e\\ua78f\\ua790\\ua791\\ua792\\ua793\\ua794\\ua795\\ua796\\ua797\\ua798\\ua799\\ua79a\\ua79b\\ua79c\\ua79d\\ua79e\\ua79f\\ua7a0\\ua7a1\\ua7a2\\ua7a3\\ua7a4\\ua7a5\\ua7a6\\ua7a7\\ua7a8\\ua7a9\\ua7aa\\ua7ab\\ua7ac\\ua7ad\\ua7ae\\ua7af\\ua7b0\\ua7b1\\ua7b2\\ua7b3\\ua7b4\\ua7b5\\ua7b6\\ua7b7\\ua7b8\\ua7b9\\ua7ba\\ua7bb\\ua7bc\\ua7bd\\ua7be\\ua7bf\\ua7c0\\ua7c1\\ua7c2\\ua7c3\\ua7c4\\ua7c5\\ua7c6\\ua7c7\\ua7c8\\ua7c9\\ua7ca\\ua7cb\\ua7cc\\ua7cd\\ua7ce\\ua7cf\\ua7d0\\ua7d1\\ua7d2\\ua7d3\\ua7d4\\ua7d5\\ua7d6\\ua7d7\\ua7d8\\ua7d9\\ua7da\\ua7db\\ua7dc\\ua7dd\\ua7de\\ua7df\\ua7e0\\ua7e1\\ua7e2\\ua7e3\\ua7e4\\ua7e5\\ua7e6\\ua7e7\\ua7e8\\ua7e9\\ua7ea\\ua7eb\\ua7ec\\ua7ed\\ua7ee\\ua7ef\\ua7f0\\ua7f1\\ua7f2\\ua7f3\\ua7f4\\ua7f5\\ua7f6\\ua7f7\\ua7f8\\ua7f9\\ua7fa\\ua7fb\\ua7fc\\ua7fd\\ua7fe\\ua7ff\\ua82c\\ua82d\\ua82e\\ua82f\\ua830\\ua831\\ua832\\ua833\\ua834\\ua835\\ua836\\ua837\\ua838\\ua839\\ua83a\\ua83b\\ua83c\\ua83d\\ua83e\\ua83f\\ua840\\ua841\\ua842\\ua843\\ua844\\ua845\\ua846\\ua847\\ua848\\ua849\\ua84a\\ua84b\\ua84c\\ua84d\\ua84e\\ua84f\\ua850\\ua851\\ua852\\ua853\\ua854\\ua855\\ua856\\ua857\\ua858\\ua859\\ua85a\\ua85b\\ua85c\\ua85d\\ua85e\\ua85f\\ua860\\ua861\\ua862\\ua863\\ua864\\ua865\\ua866\\ua867\\ua868\\ua869\\ua86a\\ua86b\\ua86c\\ua86d\\ua86e\\ua86f\\ua870\\ua871\\ua872\\ua873\\ua874\\ua875\\ua876\\ua877\\ua878\\ua879\\ua87a\\ua87b\\ua87c\\ua87d\\ua87e\\ua87f\\ua880\\ua881\\ua882\\ua883\\ua884\\ua885\\ua886\\ua887\\ua888\\ua889\\ua88a\\ua88b\\ua88c\\ua88d\\ua88e\\ua88f\\ua890\\ua891\\ua892\\ua893\\ua894\\ua895\\ua896\\ua897\\ua898\\ua899\\ua89a\\ua89b\\ua89c\\ua89d\\ua89e\\ua89f\\ua8a0\\ua8a1\\ua8a2\\ua8a3\\ua8a4\\ua8a5\\ua8a6\\ua8a7\\ua8a8\\ua8a9\\ua8aa\\ua8ab\\ua8ac\\ua8ad\\ua8ae\\ua8af\\ua8b0\\ua8b1\\ua8b2\\ua8b3\\ua8b4\\ua8b5\\ua8b6\\ua8b7\\ua8b8\\ua8b9\\ua8ba\\ua8bb\\ua8bc\\ua8bd\\ua8be\\ua8bf\\ua8c0\\ua8c1\\ua8c2\\ua8c3\\ua8c4\\ua8c5\\ua8c6\\ua8c7\\ua8c8\\ua8c9\\ua8ca\\ua8cb\\ua8cc\\ua8cd\\ua8ce\\ua8cf\\ua8d0\\ua8d1\\ua8d2\\ua8d3\\ua8d4\\ua8d5\\ua8d6\\ua8d7\\ua8d8\\ua8d9\\ua8da\\ua8db\\ua8dc\\ua8dd\\ua8de\\ua8df\\ua8e0\\ua8e1\\ua8e2\\ua8e3\\ua8e4\\ua8e5\\ua8e6\\ua8e7\\ua8e8\\ua8e9\\ua8ea\\ua8eb\\ua8ec\\ua8ed\\ua8ee\\ua8ef\\ua8f0\\ua8f1\\ua8f2\\ua8f3\\ua8f4\\ua8f5\\ua8f6\\ua8f7\\ua8f8\\ua8f9\\ua8fa\\ua8fb\\ua8fc\\ua8fd\\ua8fe\\ua8ff\\ua900\\ua901\\ua902\\ua903\\ua904\\ua905\\ua906\\ua907\\ua908\\ua909\\ua90a\\ua90b\\ua90c\\ua90d\\ua90e\\ua90f\\ua910\\ua911\\ua912\\ua913\\ua914\\ua915\\ua916\\ua917\\ua918\\ua919\\ua91a\\ua91b\\ua91c\\ua91d\\ua91e\\ua91f\\ua920\\ua921\\ua922\\ua923\\ua924\\ua925\\ua926\\ua927\\ua928\\ua929\\ua92a\\ua92b\\ua92c\\ua92d\\ua92e\\ua92f\\ua930\\ua931\\ua932\\ua933\\ua934\\ua935\\ua936\\ua937\\ua938\\ua939\\ua93a\\ua93b\\ua93c\\ua93d\\ua93e\\ua93f\\ua940\\ua941\\ua942\\ua943\\ua944\\ua945\\ua946\\ua947\\ua948\\ua949\\ua94a\\ua94b\\ua94c\\ua94d\\ua94e\\ua94f\\ua950\\ua951\\ua952\\ua953\\ua954\\ua955\\ua956\\ua957\\ua958\\ua959\\ua95a\\ua95b\\ua95c\\ua95d\\ua95e\\ua95f\\ua960\\ua961\\ua962\\ua963\\ua964\\ua965\\ua966\\ua967\\ua968\\ua969\\ua96a\\ua96b\\ua96c\\ua96d\\ua96e\\ua96f\\ua970\\ua971\\ua972\\ua973\\ua974\\ua975\\ua976\\ua977\\ua978\\ua979\\ua97a\\ua97b\\ua97c\\ua97d\\ua97e\\ua97f\\ua980\\ua981\\ua982\\ua983\\ua984\\ua985\\ua986\\ua987\\ua988\\ua989\\ua98a\\ua98b\\ua98c\\ua98d\\ua98e\\ua98f\\ua990\\ua991\\ua992\\ua993\\ua994\\ua995\\ua996\\ua997\\ua998\\ua999\\ua99a\\ua99b\\ua99c\\ua99d\\ua99e\\ua99f\\ua9a0\\ua9a1\\ua9a2\\ua9a3\\ua9a4\\ua9a5\\ua9a6\\ua9a7\\ua9a8\\ua9a9\\ua9aa\\ua9ab\\ua9ac\\ua9ad\\ua9ae\\ua9af\\ua9b0\\ua9b1\\ua9b2\\ua9b3\\ua9b4\\ua9b5\\ua9b6\\ua9b7\\ua9b8\\ua9b9\\ua9ba\\ua9bb\\ua9bc\\ua9bd\\ua9be\\ua9bf\\ua9c0\\ua9c1\\ua9c2\\ua9c3\\ua9c4\\ua9c5\\ua9c6\\ua9c7\\ua9c8\\ua9c9\\ua9ca\\ua9cb\\ua9cc\\ua9cd\\ua9ce\\ua9cf\\ua9d0\\ua9d1\\ua9d2\\ua9d3\\ua9d4\\ua9d5\\ua9d6\\ua9d7\\ua9d8\\ua9d9\\ua9da\\ua9db\\ua9dc\\ua9dd\\ua9de\\ua9df\\ua9e0\\ua9e1\\ua9e2\\ua9e3\\ua9e4\\ua9e5\\ua9e6\\ua9e7\\ua9e8\\ua9e9\\ua9ea\\ua9eb\\ua9ec\\ua9ed\\ua9ee\\ua9ef\\ua9f0\\ua9f1\\ua9f2\\ua9f3\\ua9f4\\ua9f5\\ua9f6\\ua9f7\\ua9f8\\ua9f9\\ua9fa\\ua9fb\\ua9fc\\ua9fd\\ua9fe\\ua9ff\\uaa00\\uaa01\\uaa02\\uaa03\\uaa04\\uaa05\\uaa06\\uaa07\\uaa08\\uaa09\\uaa0a\\uaa0b\\uaa0c\\uaa0d\\uaa0e\\uaa0f\\uaa10\\uaa11\\uaa12\\uaa13\\uaa14\\uaa15\\uaa16\\uaa17\\uaa18\\uaa19\\uaa1a\\uaa1b\\uaa1c\\uaa1d\\uaa1e\\uaa1f\\uaa20\\uaa21\\uaa22\\uaa23\\uaa24\\uaa25\\uaa26\\uaa27\\uaa28\\uaa29\\uaa2a\\uaa2b\\uaa2c\\uaa2d\\uaa2e\\uaa2f\\uaa30\\uaa31\\uaa32\\uaa33\\uaa34\\uaa35\\uaa36\\uaa37\\uaa38\\uaa39\\uaa3a\\uaa3b\\uaa3c\\uaa3d\\uaa3e\\uaa3f\\uaa40\\uaa41\\uaa42\\uaa43\\uaa44\\uaa45\\uaa46\\uaa47\\uaa48\\uaa49\\uaa4a\\uaa4b\\uaa4c\\uaa4d\\uaa4e\\uaa4f\\uaa50\\uaa51\\uaa52\\uaa53\\uaa54\\uaa55\\uaa56\\uaa57\\uaa58\\uaa59\\uaa5a\\uaa5b\\uaa5c\\uaa5d\\uaa5e\\uaa5f\\uaa60\\uaa61\\uaa62\\uaa63\\uaa64\\uaa65\\uaa66\\uaa67\\uaa68\\uaa69\\uaa6a\\uaa6b\\uaa6c\\uaa6d\\uaa6e\\uaa6f\\uaa70\\uaa71\\uaa72\\uaa73\\uaa74\\uaa75\\uaa76\\uaa77\\uaa78\\uaa79\\uaa7a\\uaa7b\\uaa7c\\uaa7d\\uaa7e\\uaa7f\\uaa80\\uaa81\\uaa82\\uaa83\\uaa84\\uaa85\\uaa86\\uaa87\\uaa88\\uaa89\\uaa8a\\uaa8b\\uaa8c\\uaa8d\\uaa8e\\uaa8f\\uaa90\\uaa91\\uaa92\\uaa93\\uaa94\\uaa95\\uaa96\\uaa97\\uaa98\\uaa99\\uaa9a\\uaa9b\\uaa9c\\uaa9d\\uaa9e\\uaa9f\\uaaa0\\uaaa1\\uaaa2\\uaaa3\\uaaa4\\uaaa5\\uaaa6\\uaaa7\\uaaa8\\uaaa9\\uaaaa\\uaaab\\uaaac\\uaaad\\uaaae\\uaaaf\\uaab0\\uaab1\\uaab2\\uaab3\\uaab4\\uaab5\\uaab6\\uaab7\\uaab8\\uaab9\\uaaba\\uaabb\\uaabc\\uaabd\\uaabe\\uaabf\\uaac0\\uaac1\\uaac2\\uaac3\\uaac4\\uaac5\\uaac6\\uaac7\\uaac8\\uaac9\\uaaca\\uaacb\\uaacc\\uaacd\\uaace\\uaacf\\uaad0\\uaad1\\uaad2\\uaad3\\uaad4\\uaad5\\uaad6\\uaad7\\uaad8\\uaad9\\uaada\\uaadb\\uaadc\\uaadd\\uaade\\uaadf\\uaae0\\uaae1\\uaae2\\uaae3\\uaae4\\uaae5\\uaae6\\uaae7\\uaae8\\uaae9\\uaaea\\uaaeb\\uaaec\\uaaed\\uaaee\\uaaef\\uaaf0\\uaaf1\\uaaf2\\uaaf3\\uaaf4\\uaaf5\\uaaf6\\uaaf7\\uaaf8\\uaaf9\\uaafa\\uaafb\\uaafc\\uaafd\\uaafe\\uaaff\\uab00\\uab01\\uab02\\uab03\\uab04\\uab05\\uab06\\uab07\\uab08\\uab09\\uab0a\\uab0b\\uab0c\\uab0d\\uab0e\\uab0f\\uab10\\uab11\\uab12\\uab13\\uab14\\uab15\\uab16\\uab17\\uab18\\uab19\\uab1a\\uab1b\\uab1c\\uab1d\\uab1e\\uab1f\\uab20\\uab21\\uab22\\uab23\\uab24\\uab25\\uab26\\uab27\\uab28\\uab29\\uab2a\\uab2b\\uab2c\\uab2d\\uab2e\\uab2f\\uab30\\uab31\\uab32\\uab33\\uab34\\uab35\\uab36\\uab37\\uab38\\uab39\\uab3a\\uab3b\\uab3c\\uab3d\\uab3e\\uab3f\\uab40\\uab41\\uab42\\uab43\\uab44\\uab45\\uab46\\uab47\\uab48\\uab49\\uab4a\\uab4b\\uab4c\\uab4d\\uab4e\\uab4f\\uab50\\uab51\\uab52\\uab53\\uab54\\uab55\\uab56\\uab57\\uab58\\uab59\\uab5a\\uab5b\\uab5c\\uab5d\\uab5e\\uab5f\\uab60\\uab61\\uab62\\uab63\\uab64\\uab65\\uab66\\uab67\\uab68\\uab69\\uab6a\\uab6b\\uab6c\\uab6d\\uab6e\\uab6f\\uab70\\uab71\\uab72\\uab73\\uab74\\uab75\\uab76\\uab77\\uab78\\uab79\\uab7a\\uab7b\\uab7c\\uab7d\\uab7e\\uab7f\\uab80\\uab81\\uab82\\uab83\\uab84\\uab85\\uab86\\uab87\\uab88\\uab89\\uab8a\\uab8b\\uab8c\\uab8d\\uab8e\\uab8f\\uab90\\uab91\\uab92\\uab93\\uab94\\uab95\\uab96\\uab97\\uab98\\uab99\\uab9a\\uab9b\\uab9c\\uab9d\\uab9e\\uab9f\\uaba0\\uaba1\\uaba2\\uaba3\\uaba4\\uaba5\\uaba6\\uaba7\\uaba8\\uaba9\\uabaa\\uabab\\uabac\\uabad\\uabae\\uabaf\\uabb0\\uabb1\\uabb2\\uabb3\\uabb4\\uabb5\\uabb6\\uabb7\\uabb8\\uabb9\\uabba\\uabbb\\uabbc\\uabbd\\uabbe\\uabbf\\uabc0\\uabc1\\uabc2\\uabc3\\uabc4\\uabc5\\uabc6\\uabc7\\uabc8\\uabc9\\uabca\\uabcb\\uabcc\\uabcd\\uabce\\uabcf\\uabd0\\uabd1\\uabd2\\uabd3\\uabd4\\uabd5\\uabd6\\uabd7\\uabd8\\uabd9\\uabda\\uabdb\\uabdc\\uabdd\\uabde\\uabdf\\uabe0\\uabe1\\uabe2\\uabe3\\uabe4\\uabe5\\uabe6\\uabe7\\uabe8\\uabe9\\uabea\\uabeb\\uabec\\uabed\\uabee\\uabef\\uabf0\\uabf1\\uabf2\\uabf3\\uabf4\\uabf5\\uabf6\\uabf7\\uabf8\\uabf9\\uabfa\\uabfb\\uabfc\\uabfd\\uabfe\\uabff\\ud7a4\\ud7a5\\ud7a6\\ud7a7\\ud7a8\\ud7a9\\ud7aa\\ud7ab\\ud7ac\\ud7ad\\ud7ae\\ud7af\\ud7b0\\ud7b1\\ud7b2\\ud7b3\\ud7b4\\ud7b5\\ud7b6\\ud7b7\\ud7b8\\ud7b9\\ud7ba\\ud7bb\\ud7bc\\ud7bd\\ud7be\\ud7bf\\ud7c0\\ud7c1\\ud7c2\\ud7c3\\ud7c4\\ud7c5\\ud7c6\\ud7c7\\ud7c8\\ud7c9\\ud7ca\\ud7cb\\ud7cc\\ud7cd\\ud7ce\\ud7cf\\ud7d0\\ud7d1\\ud7d2\\ud7d3\\ud7d4\\ud7d5\\ud7d6\\ud7d7\\ud7d8\\ud7d9\\ud7da\\ud7db\\ud7dc\\ud7dd\\ud7de\\ud7df\\ud7e0\\ud7e1\\ud7e2\\ud7e3\\ud7e4\\ud7e5\\ud7e6\\ud7e7\\ud7e8\\ud7e9\\ud7ea\\ud7eb\\ud7ec\\ud7ed\\ud7ee\\ud7ef\\ud7f0\\ud7f1\\ud7f2\\ud7f3\\ud7f4\\ud7f5\\ud7f6\\ud7f7\\ud7f8\\ud7f9\\ud7fa\\ud7fb\\ud7fc\\ud7fd\\ud7fe\\ud7ff\\ufa2e\\ufa2f\\ufa6b\\ufa6c\\ufa6d\\ufa6e\\ufa6f\\ufada\\ufadb\\ufadc\\ufadd\\ufade\\ufadf\\ufae0\\ufae1\\ufae2\\ufae3\\ufae4\\ufae5\\ufae6\\ufae7\\ufae8\\ufae9\\ufaea\\ufaeb\\ufaec\\ufaed\\ufaee\\ufaef\\ufaf0\\ufaf1\\ufaf2\\ufaf3\\ufaf4\\ufaf5\\ufaf6\\ufaf7\\ufaf8\\ufaf9\\ufafa\\ufafb\\ufafc\\ufafd\\ufafe\\ufaff\\ufb07\\ufb08\\ufb09\\ufb0a\\ufb0b\\ufb0c\\ufb0d\\ufb0e\\ufb0f\\ufb10\\ufb11\\ufb12\\ufb18\\ufb19\\ufb1a\\ufb1b\\ufb1c\\ufb37\\ufb3d\\ufb3f\\ufb42\\ufb45\\ufbb2\\ufbb3\\ufbb4\\ufbb5\\ufbb6\\ufbb7\\ufbb8\\ufbb9\\ufbba\\ufbbb\\ufbbc\\ufbbd\\ufbbe\\ufbbf\\ufbc0\\ufbc1\\ufbc2\\ufbc3\\ufbc4\\ufbc5\\ufbc6\\ufbc7\\ufbc8\\ufbc9\\ufbca\\ufbcb\\ufbcc\\ufbcd\\ufbce\\ufbcf\\ufbd0\\ufbd1\\ufbd2\\ufd40\\ufd41\\ufd42\\ufd43\\ufd44\\ufd45\\ufd46\\ufd47\\ufd48\\ufd49\\ufd4a\\ufd4b\\ufd4c\\ufd4d\\ufd4e\\ufd4f\\ufd90\\ufd91\\ufdc8\\ufdc9\\ufdca\\ufdcb\\ufdcc\\ufdcd\\ufdce\\ufdcf\\ufdd0\\ufdd1\\ufdd2\\ufdd3\\ufdd4\\ufdd5\\ufdd6\\ufdd7\\ufdd8\\ufdd9\\ufdda\\ufddb\\ufddc\\ufddd\\ufdde\\ufddf\\ufde0\\ufde1\\ufde2\\ufde3\\ufde4\\ufde5\\ufde6\\ufde7\\ufde8\\ufde9\\ufdea\\ufdeb\\ufdec\\ufded\\ufdee\\ufdef\\ufdfe\\ufdff\\ufe1a\\ufe1b\\ufe1c\\ufe1d\\ufe1e\\ufe1f\\ufe24\\ufe25\\ufe26\\ufe27\\ufe28\\ufe29\\ufe2a\\ufe2b\\ufe2c\\ufe2d\\ufe2e\\ufe2f\\ufe53\\ufe67\\ufe6c\\ufe6d\\ufe6e\\ufe6f\\ufe75\\ufefd\\ufefe\\uff00\\uffbf\\uffc0\\uffc1\\uffc8\\uffc9\\uffd0\\uffd1\\uffd8\\uffd9\\uffdd\\uffde\\uffdf\\uffe7\\uffef\\ufff0\\ufff1\\ufff2\\ufff3\\ufff4\\ufff5\\ufff6\\ufff7\\ufff8\\ufffe'\n\nCo = u'\\ue000\\ue001\\ue002\\ue003\\ue004\\ue005\\ue006\\ue007\\ue008\\ue009\\ue00a\\ue00b\\ue00c\\ue00d\\ue00e\\ue00f\\ue010\\ue011\\ue012\\ue013\\ue014\\ue015\\ue016\\ue017\\ue018\\ue019\\ue01a\\ue01b\\ue01c\\ue01d\\ue01e\\ue01f\\ue020\\ue021\\ue022\\ue023\\ue024\\ue025\\ue026\\ue027\\ue028\\ue029\\ue02a\\ue02b\\ue02c\\ue02d\\ue02e\\ue02f\\ue030\\ue031\\ue032\\ue033\\ue034\\ue035\\ue036\\ue037\\ue038\\ue039\\ue03a\\ue03b\\ue03c\\ue03d\\ue03e\\ue03f\\ue040\\ue041\\ue042\\ue043\\ue044\\ue045\\ue046\\ue047\\ue048\\ue049\\ue04a\\ue04b\\ue04c\\ue04d\\ue04e\\ue04f\\ue050\\ue051\\ue052\\ue053\\ue054\\ue055\\ue056\\ue057\\ue058\\ue059\\ue05a\\ue05b\\ue05c\\ue05d\\ue05e\\ue05f\\ue060\\ue061\\ue062\\ue063\\ue064\\ue065\\ue066\\ue067\\ue068\\ue069\\ue06a\\ue06b\\ue06c\\ue06d\\ue06e\\ue06f\\ue070\\ue071\\ue072\\ue073\\ue074\\ue075\\ue076\\ue077\\ue078\\ue079\\ue07a\\ue07b\\ue07c\\ue07d\\ue07e\\ue07f\\ue080\\ue081\\ue082\\ue083\\ue084\\ue085\\ue086\\ue087\\ue088\\ue089\\ue08a\\ue08b\\ue08c\\ue08d\\ue08e\\ue08f\\ue090\\ue091\\ue092\\ue093\\ue094\\ue095\\ue096\\ue097\\ue098\\ue099\\ue09a\\ue09b\\ue09c\\ue09d\\ue09e\\ue09f\\ue0a0\\ue0a1\\ue0a2\\ue0a3\\ue0a4\\ue0a5\\ue0a6\\ue0a7\\ue0a8\\ue0a9\\ue0aa\\ue0ab\\ue0ac\\ue0ad\\ue0ae\\ue0af\\ue0b0\\ue0b1\\ue0b2\\ue0b3\\ue0b4\\ue0b5\\ue0b6\\ue0b7\\ue0b8\\ue0b9\\ue0ba\\ue0bb\\ue0bc\\ue0bd\\ue0be\\ue0bf\\ue0c0\\ue0c1\\ue0c2\\ue0c3\\ue0c4\\ue0c5\\ue0c6\\ue0c7\\ue0c8\\ue0c9\\ue0ca\\ue0cb\\ue0cc\\ue0cd\\ue0ce\\ue0cf\\ue0d0\\ue0d1\\ue0d2\\ue0d3\\ue0d4\\ue0d5\\ue0d6\\ue0d7\\ue0d8\\ue0d9\\ue0da\\ue0db\\ue0dc\\ue0dd\\ue0de\\ue0df\\ue0e0\\ue0e1\\ue0e2\\ue0e3\\ue0e4\\ue0e5\\ue0e6\\ue0e7\\ue0e8\\ue0e9\\ue0ea\\ue0eb\\ue0ec\\ue0ed\\ue0ee\\ue0ef\\ue0f0\\ue0f1\\ue0f2\\ue0f3\\ue0f4\\ue0f5\\ue0f6\\ue0f7\\ue0f8\\ue0f9\\ue0fa\\ue0fb\\ue0fc\\ue0fd\\ue0fe\\ue0ff\\ue100\\ue101\\ue102\\ue103\\ue104\\ue105\\ue106\\ue107\\ue108\\ue109\\ue10a\\ue10b\\ue10c\\ue10d\\ue10e\\ue10f\\ue110\\ue111\\ue112\\ue113\\ue114\\ue115\\ue116\\ue117\\ue118\\ue119\\ue11a\\ue11b\\ue11c\\ue11d\\ue11e\\ue11f\\ue120\\ue121\\ue122\\ue123\\ue124\\ue125\\ue126\\ue127\\ue128\\ue129\\ue12a\\ue12b\\ue12c\\ue12d\\ue12e\\ue12f\\ue130\\ue131\\ue132\\ue133\\ue134\\ue135\\ue136\\ue137\\ue138\\ue139\\ue13a\\ue13b\\ue13c\\ue13d\\ue13e\\ue13f\\ue140\\ue141\\ue142\\ue143\\ue144\\ue145\\ue146\\ue147\\ue148\\ue149\\ue14a\\ue14b\\ue14c\\ue14d\\ue14e\\ue14f\\ue150\\ue151\\ue152\\ue153\\ue154\\ue155\\ue156\\ue157\\ue158\\ue159\\ue15a\\ue15b\\ue15c\\ue15d\\ue15e\\ue15f\\ue160\\ue161\\ue162\\ue163\\ue164\\ue165\\ue166\\ue167\\ue168\\ue169\\ue16a\\ue16b\\ue16c\\ue16d\\ue16e\\ue16f\\ue170\\ue171\\ue172\\ue173\\ue174\\ue175\\ue176\\ue177\\ue178\\ue179\\ue17a\\ue17b\\ue17c\\ue17d\\ue17e\\ue17f\\ue180\\ue181\\ue182\\ue183\\ue184\\ue185\\ue186\\ue187\\ue188\\ue189\\ue18a\\ue18b\\ue18c\\ue18d\\ue18e\\ue18f\\ue190\\ue191\\ue192\\ue193\\ue194\\ue195\\ue196\\ue197\\ue198\\ue199\\ue19a\\ue19b\\ue19c\\ue19d\\ue19e\\ue19f\\ue1a0\\ue1a1\\ue1a2\\ue1a3\\ue1a4\\ue1a5\\ue1a6\\ue1a7\\ue1a8\\ue1a9\\ue1aa\\ue1ab\\ue1ac\\ue1ad\\ue1ae\\ue1af\\ue1b0\\ue1b1\\ue1b2\\ue1b3\\ue1b4\\ue1b5\\ue1b6\\ue1b7\\ue1b8\\ue1b9\\ue1ba\\ue1bb\\ue1bc\\ue1bd\\ue1be\\ue1bf\\ue1c0\\ue1c1\\ue1c2\\ue1c3\\ue1c4\\ue1c5\\ue1c6\\ue1c7\\ue1c8\\ue1c9\\ue1ca\\ue1cb\\ue1cc\\ue1cd\\ue1ce\\ue1cf\\ue1d0\\ue1d1\\ue1d2\\ue1d3\\ue1d4\\ue1d5\\ue1d6\\ue1d7\\ue1d8\\ue1d9\\ue1da\\ue1db\\ue1dc\\ue1dd\\ue1de\\ue1df\\ue1e0\\ue1e1\\ue1e2\\ue1e3\\ue1e4\\ue1e5\\ue1e6\\ue1e7\\ue1e8\\ue1e9\\ue1ea\\ue1eb\\ue1ec\\ue1ed\\ue1ee\\ue1ef\\ue1f0\\ue1f1\\ue1f2\\ue1f3\\ue1f4\\ue1f5\\ue1f6\\ue1f7\\ue1f8\\ue1f9\\ue1fa\\ue1fb\\ue1fc\\ue1fd\\ue1fe\\ue1ff\\ue200\\ue201\\ue202\\ue203\\ue204\\ue205\\ue206\\ue207\\ue208\\ue209\\ue20a\\ue20b\\ue20c\\ue20d\\ue20e\\ue20f\\ue210\\ue211\\ue212\\ue213\\ue214\\ue215\\ue216\\ue217\\ue218\\ue219\\ue21a\\ue21b\\ue21c\\ue21d\\ue21e\\ue21f\\ue220\\ue221\\ue222\\ue223\\ue224\\ue225\\ue226\\ue227\\ue228\\ue229\\ue22a\\ue22b\\ue22c\\ue22d\\ue22e\\ue22f\\ue230\\ue231\\ue232\\ue233\\ue234\\ue235\\ue236\\ue237\\ue238\\ue239\\ue23a\\ue23b\\ue23c\\ue23d\\ue23e\\ue23f\\ue240\\ue241\\ue242\\ue243\\ue244\\ue245\\ue246\\ue247\\ue248\\ue249\\ue24a\\ue24b\\ue24c\\ue24d\\ue24e\\ue24f\\ue250\\ue251\\ue252\\ue253\\ue254\\ue255\\ue256\\ue257\\ue258\\ue259\\ue25a\\ue25b\\ue25c\\ue25d\\ue25e\\ue25f\\ue260\\ue261\\ue262\\ue263\\ue264\\ue265\\ue266\\ue267\\ue268\\ue269\\ue26a\\ue26b\\ue26c\\ue26d\\ue26e\\ue26f\\ue270\\ue271\\ue272\\ue273\\ue274\\ue275\\ue276\\ue277\\ue278\\ue279\\ue27a\\ue27b\\ue27c\\ue27d\\ue27e\\ue27f\\ue280\\ue281\\ue282\\ue283\\ue284\\ue285\\ue286\\ue287\\ue288\\ue289\\ue28a\\ue28b\\ue28c\\ue28d\\ue28e\\ue28f\\ue290\\ue291\\ue292\\ue293\\ue294\\ue295\\ue296\\ue297\\ue298\\ue299\\ue29a\\ue29b\\ue29c\\ue29d\\ue29e\\ue29f\\ue2a0\\ue2a1\\ue2a2\\ue2a3\\ue2a4\\ue2a5\\ue2a6\\ue2a7\\ue2a8\\ue2a9\\ue2aa\\ue2ab\\ue2ac\\ue2ad\\ue2ae\\ue2af\\ue2b0\\ue2b1\\ue2b2\\ue2b3\\ue2b4\\ue2b5\\ue2b6\\ue2b7\\ue2b8\\ue2b9\\ue2ba\\ue2bb\\ue2bc\\ue2bd\\ue2be\\ue2bf\\ue2c0\\ue2c1\\ue2c2\\ue2c3\\ue2c4\\ue2c5\\ue2c6\\ue2c7\\ue2c8\\ue2c9\\ue2ca\\ue2cb\\ue2cc\\ue2cd\\ue2ce\\ue2cf\\ue2d0\\ue2d1\\ue2d2\\ue2d3\\ue2d4\\ue2d5\\ue2d6\\ue2d7\\ue2d8\\ue2d9\\ue2da\\ue2db\\ue2dc\\ue2dd\\ue2de\\ue2df\\ue2e0\\ue2e1\\ue2e2\\ue2e3\\ue2e4\\ue2e5\\ue2e6\\ue2e7\\ue2e8\\ue2e9\\ue2ea\\ue2eb\\ue2ec\\ue2ed\\ue2ee\\ue2ef\\ue2f0\\ue2f1\\ue2f2\\ue2f3\\ue2f4\\ue2f5\\ue2f6\\ue2f7\\ue2f8\\ue2f9\\ue2fa\\ue2fb\\ue2fc\\ue2fd\\ue2fe\\ue2ff\\ue300\\ue301\\ue302\\ue303\\ue304\\ue305\\ue306\\ue307\\ue308\\ue309\\ue30a\\ue30b\\ue30c\\ue30d\\ue30e\\ue30f\\ue310\\ue311\\ue312\\ue313\\ue314\\ue315\\ue316\\ue317\\ue318\\ue319\\ue31a\\ue31b\\ue31c\\ue31d\\ue31e\\ue31f\\ue320\\ue321\\ue322\\ue323\\ue324\\ue325\\ue326\\ue327\\ue328\\ue329\\ue32a\\ue32b\\ue32c\\ue32d\\ue32e\\ue32f\\ue330\\ue331\\ue332\\ue333\\ue334\\ue335\\ue336\\ue337\\ue338\\ue339\\ue33a\\ue33b\\ue33c\\ue33d\\ue33e\\ue33f\\ue340\\ue341\\ue342\\ue343\\ue344\\ue345\\ue346\\ue347\\ue348\\ue349\\ue34a\\ue34b\\ue34c\\ue34d\\ue34e\\ue34f\\ue350\\ue351\\ue352\\ue353\\ue354\\ue355\\ue356\\ue357\\ue358\\ue359\\ue35a\\ue35b\\ue35c\\ue35d\\ue35e\\ue35f\\ue360\\ue361\\ue362\\ue363\\ue364\\ue365\\ue366\\ue367\\ue368\\ue369\\ue36a\\ue36b\\ue36c\\ue36d\\ue36e\\ue36f\\ue370\\ue371\\ue372\\ue373\\ue374\\ue375\\ue376\\ue377\\ue378\\ue379\\ue37a\\ue37b\\ue37c\\ue37d\\ue37e\\ue37f\\ue380\\ue381\\ue382\\ue383\\ue384\\ue385\\ue386\\ue387\\ue388\\ue389\\ue38a\\ue38b\\ue38c\\ue38d\\ue38e\\ue38f\\ue390\\ue391\\ue392\\ue393\\ue394\\ue395\\ue396\\ue397\\ue398\\ue399\\ue39a\\ue39b\\ue39c\\ue39d\\ue39e\\ue39f\\ue3a0\\ue3a1\\ue3a2\\ue3a3\\ue3a4\\ue3a5\\ue3a6\\ue3a7\\ue3a8\\ue3a9\\ue3aa\\ue3ab\\ue3ac\\ue3ad\\ue3ae\\ue3af\\ue3b0\\ue3b1\\ue3b2\\ue3b3\\ue3b4\\ue3b5\\ue3b6\\ue3b7\\ue3b8\\ue3b9\\ue3ba\\ue3bb\\ue3bc\\ue3bd\\ue3be\\ue3bf\\ue3c0\\ue3c1\\ue3c2\\ue3c3\\ue3c4\\ue3c5\\ue3c6\\ue3c7\\ue3c8\\ue3c9\\ue3ca\\ue3cb\\ue3cc\\ue3cd\\ue3ce\\ue3cf\\ue3d0\\ue3d1\\ue3d2\\ue3d3\\ue3d4\\ue3d5\\ue3d6\\ue3d7\\ue3d8\\ue3d9\\ue3da\\ue3db\\ue3dc\\ue3dd\\ue3de\\ue3df\\ue3e0\\ue3e1\\ue3e2\\ue3e3\\ue3e4\\ue3e5\\ue3e6\\ue3e7\\ue3e8\\ue3e9\\ue3ea\\ue3eb\\ue3ec\\ue3ed\\ue3ee\\ue3ef\\ue3f0\\ue3f1\\ue3f2\\ue3f3\\ue3f4\\ue3f5\\ue3f6\\ue3f7\\ue3f8\\ue3f9\\ue3fa\\ue3fb\\ue3fc\\ue3fd\\ue3fe\\ue3ff\\ue400\\ue401\\ue402\\ue403\\ue404\\ue405\\ue406\\ue407\\ue408\\ue409\\ue40a\\ue40b\\ue40c\\ue40d\\ue40e\\ue40f\\ue410\\ue411\\ue412\\ue413\\ue414\\ue415\\ue416\\ue417\\ue418\\ue419\\ue41a\\ue41b\\ue41c\\ue41d\\ue41e\\ue41f\\ue420\\ue421\\ue422\\ue423\\ue424\\ue425\\ue426\\ue427\\ue428\\ue429\\ue42a\\ue42b\\ue42c\\ue42d\\ue42e\\ue42f\\ue430\\ue431\\ue432\\ue433\\ue434\\ue435\\ue436\\ue437\\ue438\\ue439\\ue43a\\ue43b\\ue43c\\ue43d\\ue43e\\ue43f\\ue440\\ue441\\ue442\\ue443\\ue444\\ue445\\ue446\\ue447\\ue448\\ue449\\ue44a\\ue44b\\ue44c\\ue44d\\ue44e\\ue44f\\ue450\\ue451\\ue452\\ue453\\ue454\\ue455\\ue456\\ue457\\ue458\\ue459\\ue45a\\ue45b\\ue45c\\ue45d\\ue45e\\ue45f\\ue460\\ue461\\ue462\\ue463\\ue464\\ue465\\ue466\\ue467\\ue468\\ue469\\ue46a\\ue46b\\ue46c\\ue46d\\ue46e\\ue46f\\ue470\\ue471\\ue472\\ue473\\ue474\\ue475\\ue476\\ue477\\ue478\\ue479\\ue47a\\ue47b\\ue47c\\ue47d\\ue47e\\ue47f\\ue480\\ue481\\ue482\\ue483\\ue484\\ue485\\ue486\\ue487\\ue488\\ue489\\ue48a\\ue48b\\ue48c\\ue48d\\ue48e\\ue48f\\ue490\\ue491\\ue492\\ue493\\ue494\\ue495\\ue496\\ue497\\ue498\\ue499\\ue49a\\ue49b\\ue49c\\ue49d\\ue49e\\ue49f\\ue4a0\\ue4a1\\ue4a2\\ue4a3\\ue4a4\\ue4a5\\ue4a6\\ue4a7\\ue4a8\\ue4a9\\ue4aa\\ue4ab\\ue4ac\\ue4ad\\ue4ae\\ue4af\\ue4b0\\ue4b1\\ue4b2\\ue4b3\\ue4b4\\ue4b5\\ue4b6\\ue4b7\\ue4b8\\ue4b9\\ue4ba\\ue4bb\\ue4bc\\ue4bd\\ue4be\\ue4bf\\ue4c0\\ue4c1\\ue4c2\\ue4c3\\ue4c4\\ue4c5\\ue4c6\\ue4c7\\ue4c8\\ue4c9\\ue4ca\\ue4cb\\ue4cc\\ue4cd\\ue4ce\\ue4cf\\ue4d0\\ue4d1\\ue4d2\\ue4d3\\ue4d4\\ue4d5\\ue4d6\\ue4d7\\ue4d8\\ue4d9\\ue4da\\ue4db\\ue4dc\\ue4dd\\ue4de\\ue4df\\ue4e0\\ue4e1\\ue4e2\\ue4e3\\ue4e4\\ue4e5\\ue4e6\\ue4e7\\ue4e8\\ue4e9\\ue4ea\\ue4eb\\ue4ec\\ue4ed\\ue4ee\\ue4ef\\ue4f0\\ue4f1\\ue4f2\\ue4f3\\ue4f4\\ue4f5\\ue4f6\\ue4f7\\ue4f8\\ue4f9\\ue4fa\\ue4fb\\ue4fc\\ue4fd\\ue4fe\\ue4ff\\ue500\\ue501\\ue502\\ue503\\ue504\\ue505\\ue506\\ue507\\ue508\\ue509\\ue50a\\ue50b\\ue50c\\ue50d\\ue50e\\ue50f\\ue510\\ue511\\ue512\\ue513\\ue514\\ue515\\ue516\\ue517\\ue518\\ue519\\ue51a\\ue51b\\ue51c\\ue51d\\ue51e\\ue51f\\ue520\\ue521\\ue522\\ue523\\ue524\\ue525\\ue526\\ue527\\ue528\\ue529\\ue52a\\ue52b\\ue52c\\ue52d\\ue52e\\ue52f\\ue530\\ue531\\ue532\\ue533\\ue534\\ue535\\ue536\\ue537\\ue538\\ue539\\ue53a\\ue53b\\ue53c\\ue53d\\ue53e\\ue53f\\ue540\\ue541\\ue542\\ue543\\ue544\\ue545\\ue546\\ue547\\ue548\\ue549\\ue54a\\ue54b\\ue54c\\ue54d\\ue54e\\ue54f\\ue550\\ue551\\ue552\\ue553\\ue554\\ue555\\ue556\\ue557\\ue558\\ue559\\ue55a\\ue55b\\ue55c\\ue55d\\ue55e\\ue55f\\ue560\\ue561\\ue562\\ue563\\ue564\\ue565\\ue566\\ue567\\ue568\\ue569\\ue56a\\ue56b\\ue56c\\ue56d\\ue56e\\ue56f\\ue570\\ue571\\ue572\\ue573\\ue574\\ue575\\ue576\\ue577\\ue578\\ue579\\ue57a\\ue57b\\ue57c\\ue57d\\ue57e\\ue57f\\ue580\\ue581\\ue582\\ue583\\ue584\\ue585\\ue586\\ue587\\ue588\\ue589\\ue58a\\ue58b\\ue58c\\ue58d\\ue58e\\ue58f\\ue590\\ue591\\ue592\\ue593\\ue594\\ue595\\ue596\\ue597\\ue598\\ue599\\ue59a\\ue59b\\ue59c\\ue59d\\ue59e\\ue59f\\ue5a0\\ue5a1\\ue5a2\\ue5a3\\ue5a4\\ue5a5\\ue5a6\\ue5a7\\ue5a8\\ue5a9\\ue5aa\\ue5ab\\ue5ac\\ue5ad\\ue5ae\\ue5af\\ue5b0\\ue5b1\\ue5b2\\ue5b3\\ue5b4\\ue5b5\\ue5b6\\ue5b7\\ue5b8\\ue5b9\\ue5ba\\ue5bb\\ue5bc\\ue5bd\\ue5be\\ue5bf\\ue5c0\\ue5c1\\ue5c2\\ue5c3\\ue5c4\\ue5c5\\ue5c6\\ue5c7\\ue5c8\\ue5c9\\ue5ca\\ue5cb\\ue5cc\\ue5cd\\ue5ce\\ue5cf\\ue5d0\\ue5d1\\ue5d2\\ue5d3\\ue5d4\\ue5d5\\ue5d6\\ue5d7\\ue5d8\\ue5d9\\ue5da\\ue5db\\ue5dc\\ue5dd\\ue5de\\ue5df\\ue5e0\\ue5e1\\ue5e2\\ue5e3\\ue5e4\\ue5e5\\ue5e6\\ue5e7\\ue5e8\\ue5e9\\ue5ea\\ue5eb\\ue5ec\\ue5ed\\ue5ee\\ue5ef\\ue5f0\\ue5f1\\ue5f2\\ue5f3\\ue5f4\\ue5f5\\ue5f6\\ue5f7\\ue5f8\\ue5f9\\ue5fa\\ue5fb\\ue5fc\\ue5fd\\ue5fe\\ue5ff\\ue600\\ue601\\ue602\\ue603\\ue604\\ue605\\ue606\\ue607\\ue608\\ue609\\ue60a\\ue60b\\ue60c\\ue60d\\ue60e\\ue60f\\ue610\\ue611\\ue612\\ue613\\ue614\\ue615\\ue616\\ue617\\ue618\\ue619\\ue61a\\ue61b\\ue61c\\ue61d\\ue61e\\ue61f\\ue620\\ue621\\ue622\\ue623\\ue624\\ue625\\ue626\\ue627\\ue628\\ue629\\ue62a\\ue62b\\ue62c\\ue62d\\ue62e\\ue62f\\ue630\\ue631\\ue632\\ue633\\ue634\\ue635\\ue636\\ue637\\ue638\\ue639\\ue63a\\ue63b\\ue63c\\ue63d\\ue63e\\ue63f\\ue640\\ue641\\ue642\\ue643\\ue644\\ue645\\ue646\\ue647\\ue648\\ue649\\ue64a\\ue64b\\ue64c\\ue64d\\ue64e\\ue64f\\ue650\\ue651\\ue652\\ue653\\ue654\\ue655\\ue656\\ue657\\ue658\\ue659\\ue65a\\ue65b\\ue65c\\ue65d\\ue65e\\ue65f\\ue660\\ue661\\ue662\\ue663\\ue664\\ue665\\ue666\\ue667\\ue668\\ue669\\ue66a\\ue66b\\ue66c\\ue66d\\ue66e\\ue66f\\ue670\\ue671\\ue672\\ue673\\ue674\\ue675\\ue676\\ue677\\ue678\\ue679\\ue67a\\ue67b\\ue67c\\ue67d\\ue67e\\ue67f\\ue680\\ue681\\ue682\\ue683\\ue684\\ue685\\ue686\\ue687\\ue688\\ue689\\ue68a\\ue68b\\ue68c\\ue68d\\ue68e\\ue68f\\ue690\\ue691\\ue692\\ue693\\ue694\\ue695\\ue696\\ue697\\ue698\\ue699\\ue69a\\ue69b\\ue69c\\ue69d\\ue69e\\ue69f\\ue6a0\\ue6a1\\ue6a2\\ue6a3\\ue6a4\\ue6a5\\ue6a6\\ue6a7\\ue6a8\\ue6a9\\ue6aa\\ue6ab\\ue6ac\\ue6ad\\ue6ae\\ue6af\\ue6b0\\ue6b1\\ue6b2\\ue6b3\\ue6b4\\ue6b5\\ue6b6\\ue6b7\\ue6b8\\ue6b9\\ue6ba\\ue6bb\\ue6bc\\ue6bd\\ue6be\\ue6bf\\ue6c0\\ue6c1\\ue6c2\\ue6c3\\ue6c4\\ue6c5\\ue6c6\\ue6c7\\ue6c8\\ue6c9\\ue6ca\\ue6cb\\ue6cc\\ue6cd\\ue6ce\\ue6cf\\ue6d0\\ue6d1\\ue6d2\\ue6d3\\ue6d4\\ue6d5\\ue6d6\\ue6d7\\ue6d8\\ue6d9\\ue6da\\ue6db\\ue6dc\\ue6dd\\ue6de\\ue6df\\ue6e0\\ue6e1\\ue6e2\\ue6e3\\ue6e4\\ue6e5\\ue6e6\\ue6e7\\ue6e8\\ue6e9\\ue6ea\\ue6eb\\ue6ec\\ue6ed\\ue6ee\\ue6ef\\ue6f0\\ue6f1\\ue6f2\\ue6f3\\ue6f4\\ue6f5\\ue6f6\\ue6f7\\ue6f8\\ue6f9\\ue6fa\\ue6fb\\ue6fc\\ue6fd\\ue6fe\\ue6ff\\ue700\\ue701\\ue702\\ue703\\ue704\\ue705\\ue706\\ue707\\ue708\\ue709\\ue70a\\ue70b\\ue70c\\ue70d\\ue70e\\ue70f\\ue710\\ue711\\ue712\\ue713\\ue714\\ue715\\ue716\\ue717\\ue718\\ue719\\ue71a\\ue71b\\ue71c\\ue71d\\ue71e\\ue71f\\ue720\\ue721\\ue722\\ue723\\ue724\\ue725\\ue726\\ue727\\ue728\\ue729\\ue72a\\ue72b\\ue72c\\ue72d\\ue72e\\ue72f\\ue730\\ue731\\ue732\\ue733\\ue734\\ue735\\ue736\\ue737\\ue738\\ue739\\ue73a\\ue73b\\ue73c\\ue73d\\ue73e\\ue73f\\ue740\\ue741\\ue742\\ue743\\ue744\\ue745\\ue746\\ue747\\ue748\\ue749\\ue74a\\ue74b\\ue74c\\ue74d\\ue74e\\ue74f\\ue750\\ue751\\ue752\\ue753\\ue754\\ue755\\ue756\\ue757\\ue758\\ue759\\ue75a\\ue75b\\ue75c\\ue75d\\ue75e\\ue75f\\ue760\\ue761\\ue762\\ue763\\ue764\\ue765\\ue766\\ue767\\ue768\\ue769\\ue76a\\ue76b\\ue76c\\ue76d\\ue76e\\ue76f\\ue770\\ue771\\ue772\\ue773\\ue774\\ue775\\ue776\\ue777\\ue778\\ue779\\ue77a\\ue77b\\ue77c\\ue77d\\ue77e\\ue77f\\ue780\\ue781\\ue782\\ue783\\ue784\\ue785\\ue786\\ue787\\ue788\\ue789\\ue78a\\ue78b\\ue78c\\ue78d\\ue78e\\ue78f\\ue790\\ue791\\ue792\\ue793\\ue794\\ue795\\ue796\\ue797\\ue798\\ue799\\ue79a\\ue79b\\ue79c\\ue79d\\ue79e\\ue79f\\ue7a0\\ue7a1\\ue7a2\\ue7a3\\ue7a4\\ue7a5\\ue7a6\\ue7a7\\ue7a8\\ue7a9\\ue7aa\\ue7ab\\ue7ac\\ue7ad\\ue7ae\\ue7af\\ue7b0\\ue7b1\\ue7b2\\ue7b3\\ue7b4\\ue7b5\\ue7b6\\ue7b7\\ue7b8\\ue7b9\\ue7ba\\ue7bb\\ue7bc\\ue7bd\\ue7be\\ue7bf\\ue7c0\\ue7c1\\ue7c2\\ue7c3\\ue7c4\\ue7c5\\ue7c6\\ue7c7\\ue7c8\\ue7c9\\ue7ca\\ue7cb\\ue7cc\\ue7cd\\ue7ce\\ue7cf\\ue7d0\\ue7d1\\ue7d2\\ue7d3\\ue7d4\\ue7d5\\ue7d6\\ue7d7\\ue7d8\\ue7d9\\ue7da\\ue7db\\ue7dc\\ue7dd\\ue7de\\ue7df\\ue7e0\\ue7e1\\ue7e2\\ue7e3\\ue7e4\\ue7e5\\ue7e6\\ue7e7\\ue7e8\\ue7e9\\ue7ea\\ue7eb\\ue7ec\\ue7ed\\ue7ee\\ue7ef\\ue7f0\\ue7f1\\ue7f2\\ue7f3\\ue7f4\\ue7f5\\ue7f6\\ue7f7\\ue7f8\\ue7f9\\ue7fa\\ue7fb\\ue7fc\\ue7fd\\ue7fe\\ue7ff\\ue800\\ue801\\ue802\\ue803\\ue804\\ue805\\ue806\\ue807\\ue808\\ue809\\ue80a\\ue80b\\ue80c\\ue80d\\ue80e\\ue80f\\ue810\\ue811\\ue812\\ue813\\ue814\\ue815\\ue816\\ue817\\ue818\\ue819\\ue81a\\ue81b\\ue81c\\ue81d\\ue81e\\ue81f\\ue820\\ue821\\ue822\\ue823\\ue824\\ue825\\ue826\\ue827\\ue828\\ue829\\ue82a\\ue82b\\ue82c\\ue82d\\ue82e\\ue82f\\ue830\\ue831\\ue832\\ue833\\ue834\\ue835\\ue836\\ue837\\ue838\\ue839\\ue83a\\ue83b\\ue83c\\ue83d\\ue83e\\ue83f\\ue840\\ue841\\ue842\\ue843\\ue844\\ue845\\ue846\\ue847\\ue848\\ue849\\ue84a\\ue84b\\ue84c\\ue84d\\ue84e\\ue84f\\ue850\\ue851\\ue852\\ue853\\ue854\\ue855\\ue856\\ue857\\ue858\\ue859\\ue85a\\ue85b\\ue85c\\ue85d\\ue85e\\ue85f\\ue860\\ue861\\ue862\\ue863\\ue864\\ue865\\ue866\\ue867\\ue868\\ue869\\ue86a\\ue86b\\ue86c\\ue86d\\ue86e\\ue86f\\ue870\\ue871\\ue872\\ue873\\ue874\\ue875\\ue876\\ue877\\ue878\\ue879\\ue87a\\ue87b\\ue87c\\ue87d\\ue87e\\ue87f\\ue880\\ue881\\ue882\\ue883\\ue884\\ue885\\ue886\\ue887\\ue888\\ue889\\ue88a\\ue88b\\ue88c\\ue88d\\ue88e\\ue88f\\ue890\\ue891\\ue892\\ue893\\ue894\\ue895\\ue896\\ue897\\ue898\\ue899\\ue89a\\ue89b\\ue89c\\ue89d\\ue89e\\ue89f\\ue8a0\\ue8a1\\ue8a2\\ue8a3\\ue8a4\\ue8a5\\ue8a6\\ue8a7\\ue8a8\\ue8a9\\ue8aa\\ue8ab\\ue8ac\\ue8ad\\ue8ae\\ue8af\\ue8b0\\ue8b1\\ue8b2\\ue8b3\\ue8b4\\ue8b5\\ue8b6\\ue8b7\\ue8b8\\ue8b9\\ue8ba\\ue8bb\\ue8bc\\ue8bd\\ue8be\\ue8bf\\ue8c0\\ue8c1\\ue8c2\\ue8c3\\ue8c4\\ue8c5\\ue8c6\\ue8c7\\ue8c8\\ue8c9\\ue8ca\\ue8cb\\ue8cc\\ue8cd\\ue8ce\\ue8cf\\ue8d0\\ue8d1\\ue8d2\\ue8d3\\ue8d4\\ue8d5\\ue8d6\\ue8d7\\ue8d8\\ue8d9\\ue8da\\ue8db\\ue8dc\\ue8dd\\ue8de\\ue8df\\ue8e0\\ue8e1\\ue8e2\\ue8e3\\ue8e4\\ue8e5\\ue8e6\\ue8e7\\ue8e8\\ue8e9\\ue8ea\\ue8eb\\ue8ec\\ue8ed\\ue8ee\\ue8ef\\ue8f0\\ue8f1\\ue8f2\\ue8f3\\ue8f4\\ue8f5\\ue8f6\\ue8f7\\ue8f8\\ue8f9\\ue8fa\\ue8fb\\ue8fc\\ue8fd\\ue8fe\\ue8ff\\ue900\\ue901\\ue902\\ue903\\ue904\\ue905\\ue906\\ue907\\ue908\\ue909\\ue90a\\ue90b\\ue90c\\ue90d\\ue90e\\ue90f\\ue910\\ue911\\ue912\\ue913\\ue914\\ue915\\ue916\\ue917\\ue918\\ue919\\ue91a\\ue91b\\ue91c\\ue91d\\ue91e\\ue91f\\ue920\\ue921\\ue922\\ue923\\ue924\\ue925\\ue926\\ue927\\ue928\\ue929\\ue92a\\ue92b\\ue92c\\ue92d\\ue92e\\ue92f\\ue930\\ue931\\ue932\\ue933\\ue934\\ue935\\ue936\\ue937\\ue938\\ue939\\ue93a\\ue93b\\ue93c\\ue93d\\ue93e\\ue93f\\ue940\\ue941\\ue942\\ue943\\ue944\\ue945\\ue946\\ue947\\ue948\\ue949\\ue94a\\ue94b\\ue94c\\ue94d\\ue94e\\ue94f\\ue950\\ue951\\ue952\\ue953\\ue954\\ue955\\ue956\\ue957\\ue958\\ue959\\ue95a\\ue95b\\ue95c\\ue95d\\ue95e\\ue95f\\ue960\\ue961\\ue962\\ue963\\ue964\\ue965\\ue966\\ue967\\ue968\\ue969\\ue96a\\ue96b\\ue96c\\ue96d\\ue96e\\ue96f\\ue970\\ue971\\ue972\\ue973\\ue974\\ue975\\ue976\\ue977\\ue978\\ue979\\ue97a\\ue97b\\ue97c\\ue97d\\ue97e\\ue97f\\ue980\\ue981\\ue982\\ue983\\ue984\\ue985\\ue986\\ue987\\ue988\\ue989\\ue98a\\ue98b\\ue98c\\ue98d\\ue98e\\ue98f\\ue990\\ue991\\ue992\\ue993\\ue994\\ue995\\ue996\\ue997\\ue998\\ue999\\ue99a\\ue99b\\ue99c\\ue99d\\ue99e\\ue99f\\ue9a0\\ue9a1\\ue9a2\\ue9a3\\ue9a4\\ue9a5\\ue9a6\\ue9a7\\ue9a8\\ue9a9\\ue9aa\\ue9ab\\ue9ac\\ue9ad\\ue9ae\\ue9af\\ue9b0\\ue9b1\\ue9b2\\ue9b3\\ue9b4\\ue9b5\\ue9b6\\ue9b7\\ue9b8\\ue9b9\\ue9ba\\ue9bb\\ue9bc\\ue9bd\\ue9be\\ue9bf\\ue9c0\\ue9c1\\ue9c2\\ue9c3\\ue9c4\\ue9c5\\ue9c6\\ue9c7\\ue9c8\\ue9c9\\ue9ca\\ue9cb\\ue9cc\\ue9cd\\ue9ce\\ue9cf\\ue9d0\\ue9d1\\ue9d2\\ue9d3\\ue9d4\\ue9d5\\ue9d6\\ue9d7\\ue9d8\\ue9d9\\ue9da\\ue9db\\ue9dc\\ue9dd\\ue9de\\ue9df\\ue9e0\\ue9e1\\ue9e2\\ue9e3\\ue9e4\\ue9e5\\ue9e6\\ue9e7\\ue9e8\\ue9e9\\ue9ea\\ue9eb\\ue9ec\\ue9ed\\ue9ee\\ue9ef\\ue9f0\\ue9f1\\ue9f2\\ue9f3\\ue9f4\\ue9f5\\ue9f6\\ue9f7\\ue9f8\\ue9f9\\ue9fa\\ue9fb\\ue9fc\\ue9fd\\ue9fe\\ue9ff\\uea00\\uea01\\uea02\\uea03\\uea04\\uea05\\uea06\\uea07\\uea08\\uea09\\uea0a\\uea0b\\uea0c\\uea0d\\uea0e\\uea0f\\uea10\\uea11\\uea12\\uea13\\uea14\\uea15\\uea16\\uea17\\uea18\\uea19\\uea1a\\uea1b\\uea1c\\uea1d\\uea1e\\uea1f\\uea20\\uea21\\uea22\\uea23\\uea24\\uea25\\uea26\\uea27\\uea28\\uea29\\uea2a\\uea2b\\uea2c\\uea2d\\uea2e\\uea2f\\uea30\\uea31\\uea32\\uea33\\uea34\\uea35\\uea36\\uea37\\uea38\\uea39\\uea3a\\uea3b\\uea3c\\uea3d\\uea3e\\uea3f\\uea40\\uea41\\uea42\\uea43\\uea44\\uea45\\uea46\\uea47\\uea48\\uea49\\uea4a\\uea4b\\uea4c\\uea4d\\uea4e\\uea4f\\uea50\\uea51\\uea52\\uea53\\uea54\\uea55\\uea56\\uea57\\uea58\\uea59\\uea5a\\uea5b\\uea5c\\uea5d\\uea5e\\uea5f\\uea60\\uea61\\uea62\\uea63\\uea64\\uea65\\uea66\\uea67\\uea68\\uea69\\uea6a\\uea6b\\uea6c\\uea6d\\uea6e\\uea6f\\uea70\\uea71\\uea72\\uea73\\uea74\\uea75\\uea76\\uea77\\uea78\\uea79\\uea7a\\uea7b\\uea7c\\uea7d\\uea7e\\uea7f\\uea80\\uea81\\uea82\\uea83\\uea84\\uea85\\uea86\\uea87\\uea88\\uea89\\uea8a\\uea8b\\uea8c\\uea8d\\uea8e\\uea8f\\uea90\\uea91\\uea92\\uea93\\uea94\\uea95\\uea96\\uea97\\uea98\\uea99\\uea9a\\uea9b\\uea9c\\uea9d\\uea9e\\uea9f\\ueaa0\\ueaa1\\ueaa2\\ueaa3\\ueaa4\\ueaa5\\ueaa6\\ueaa7\\ueaa8\\ueaa9\\ueaaa\\ueaab\\ueaac\\ueaad\\ueaae\\ueaaf\\ueab0\\ueab1\\ueab2\\ueab3\\ueab4\\ueab5\\ueab6\\ueab7\\ueab8\\ueab9\\ueaba\\ueabb\\ueabc\\ueabd\\ueabe\\ueabf\\ueac0\\ueac1\\ueac2\\ueac3\\ueac4\\ueac5\\ueac6\\ueac7\\ueac8\\ueac9\\ueaca\\ueacb\\ueacc\\ueacd\\ueace\\ueacf\\uead0\\uead1\\uead2\\uead3\\uead4\\uead5\\uead6\\uead7\\uead8\\uead9\\ueada\\ueadb\\ueadc\\ueadd\\ueade\\ueadf\\ueae0\\ueae1\\ueae2\\ueae3\\ueae4\\ueae5\\ueae6\\ueae7\\ueae8\\ueae9\\ueaea\\ueaeb\\ueaec\\ueaed\\ueaee\\ueaef\\ueaf0\\ueaf1\\ueaf2\\ueaf3\\ueaf4\\ueaf5\\ueaf6\\ueaf7\\ueaf8\\ueaf9\\ueafa\\ueafb\\ueafc\\ueafd\\ueafe\\ueaff\\ueb00\\ueb01\\ueb02\\ueb03\\ueb04\\ueb05\\ueb06\\ueb07\\ueb08\\ueb09\\ueb0a\\ueb0b\\ueb0c\\ueb0d\\ueb0e\\ueb0f\\ueb10\\ueb11\\ueb12\\ueb13\\ueb14\\ueb15\\ueb16\\ueb17\\ueb18\\ueb19\\ueb1a\\ueb1b\\ueb1c\\ueb1d\\ueb1e\\ueb1f\\ueb20\\ueb21\\ueb22\\ueb23\\ueb24\\ueb25\\ueb26\\ueb27\\ueb28\\ueb29\\ueb2a\\ueb2b\\ueb2c\\ueb2d\\ueb2e\\ueb2f\\ueb30\\ueb31\\ueb32\\ueb33\\ueb34\\ueb35\\ueb36\\ueb37\\ueb38\\ueb39\\ueb3a\\ueb3b\\ueb3c\\ueb3d\\ueb3e\\ueb3f\\ueb40\\ueb41\\ueb42\\ueb43\\ueb44\\ueb45\\ueb46\\ueb47\\ueb48\\ueb49\\ueb4a\\ueb4b\\ueb4c\\ueb4d\\ueb4e\\ueb4f\\ueb50\\ueb51\\ueb52\\ueb53\\ueb54\\ueb55\\ueb56\\ueb57\\ueb58\\ueb59\\ueb5a\\ueb5b\\ueb5c\\ueb5d\\ueb5e\\ueb5f\\ueb60\\ueb61\\ueb62\\ueb63\\ueb64\\ueb65\\ueb66\\ueb67\\ueb68\\ueb69\\ueb6a\\ueb6b\\ueb6c\\ueb6d\\ueb6e\\ueb6f\\ueb70\\ueb71\\ueb72\\ueb73\\ueb74\\ueb75\\ueb76\\ueb77\\ueb78\\ueb79\\ueb7a\\ueb7b\\ueb7c\\ueb7d\\ueb7e\\ueb7f\\ueb80\\ueb81\\ueb82\\ueb83\\ueb84\\ueb85\\ueb86\\ueb87\\ueb88\\ueb89\\ueb8a\\ueb8b\\ueb8c\\ueb8d\\ueb8e\\ueb8f\\ueb90\\ueb91\\ueb92\\ueb93\\ueb94\\ueb95\\ueb96\\ueb97\\ueb98\\ueb99\\ueb9a\\ueb9b\\ueb9c\\ueb9d\\ueb9e\\ueb9f\\ueba0\\ueba1\\ueba2\\ueba3\\ueba4\\ueba5\\ueba6\\ueba7\\ueba8\\ueba9\\uebaa\\uebab\\uebac\\uebad\\uebae\\uebaf\\uebb0\\uebb1\\uebb2\\uebb3\\uebb4\\uebb5\\uebb6\\uebb7\\uebb8\\uebb9\\uebba\\uebbb\\uebbc\\uebbd\\uebbe\\uebbf\\uebc0\\uebc1\\uebc2\\uebc3\\uebc4\\uebc5\\uebc6\\uebc7\\uebc8\\uebc9\\uebca\\uebcb\\uebcc\\uebcd\\uebce\\uebcf\\uebd0\\uebd1\\uebd2\\uebd3\\uebd4\\uebd5\\uebd6\\uebd7\\uebd8\\uebd9\\uebda\\uebdb\\uebdc\\uebdd\\uebde\\uebdf\\uebe0\\uebe1\\uebe2\\uebe3\\uebe4\\uebe5\\uebe6\\uebe7\\uebe8\\uebe9\\uebea\\uebeb\\uebec\\uebed\\uebee\\uebef\\uebf0\\uebf1\\uebf2\\uebf3\\uebf4\\uebf5\\uebf6\\uebf7\\uebf8\\uebf9\\uebfa\\uebfb\\uebfc\\uebfd\\uebfe\\uebff\\uec00\\uec01\\uec02\\uec03\\uec04\\uec05\\uec06\\uec07\\uec08\\uec09\\uec0a\\uec0b\\uec0c\\uec0d\\uec0e\\uec0f\\uec10\\uec11\\uec12\\uec13\\uec14\\uec15\\uec16\\uec17\\uec18\\uec19\\uec1a\\uec1b\\uec1c\\uec1d\\uec1e\\uec1f\\uec20\\uec21\\uec22\\uec23\\uec24\\uec25\\uec26\\uec27\\uec28\\uec29\\uec2a\\uec2b\\uec2c\\uec2d\\uec2e\\uec2f\\uec30\\uec31\\uec32\\uec33\\uec34\\uec35\\uec36\\uec37\\uec38\\uec39\\uec3a\\uec3b\\uec3c\\uec3d\\uec3e\\uec3f\\uec40\\uec41\\uec42\\uec43\\uec44\\uec45\\uec46\\uec47\\uec48\\uec49\\uec4a\\uec4b\\uec4c\\uec4d\\uec4e\\uec4f\\uec50\\uec51\\uec52\\uec53\\uec54\\uec55\\uec56\\uec57\\uec58\\uec59\\uec5a\\uec5b\\uec5c\\uec5d\\uec5e\\uec5f\\uec60\\uec61\\uec62\\uec63\\uec64\\uec65\\uec66\\uec67\\uec68\\uec69\\uec6a\\uec6b\\uec6c\\uec6d\\uec6e\\uec6f\\uec70\\uec71\\uec72\\uec73\\uec74\\uec75\\uec76\\uec77\\uec78\\uec79\\uec7a\\uec7b\\uec7c\\uec7d\\uec7e\\uec7f\\uec80\\uec81\\uec82\\uec83\\uec84\\uec85\\uec86\\uec87\\uec88\\uec89\\uec8a\\uec8b\\uec8c\\uec8d\\uec8e\\uec8f\\uec90\\uec91\\uec92\\uec93\\uec94\\uec95\\uec96\\uec97\\uec98\\uec99\\uec9a\\uec9b\\uec9c\\uec9d\\uec9e\\uec9f\\ueca0\\ueca1\\ueca2\\ueca3\\ueca4\\ueca5\\ueca6\\ueca7\\ueca8\\ueca9\\uecaa\\uecab\\uecac\\uecad\\uecae\\uecaf\\uecb0\\uecb1\\uecb2\\uecb3\\uecb4\\uecb5\\uecb6\\uecb7\\uecb8\\uecb9\\uecba\\uecbb\\uecbc\\uecbd\\uecbe\\uecbf\\uecc0\\uecc1\\uecc2\\uecc3\\uecc4\\uecc5\\uecc6\\uecc7\\uecc8\\uecc9\\uecca\\ueccb\\ueccc\\ueccd\\uecce\\ueccf\\uecd0\\uecd1\\uecd2\\uecd3\\uecd4\\uecd5\\uecd6\\uecd7\\uecd8\\uecd9\\uecda\\uecdb\\uecdc\\uecdd\\uecde\\uecdf\\uece0\\uece1\\uece2\\uece3\\uece4\\uece5\\uece6\\uece7\\uece8\\uece9\\uecea\\ueceb\\uecec\\ueced\\uecee\\uecef\\uecf0\\uecf1\\uecf2\\uecf3\\uecf4\\uecf5\\uecf6\\uecf7\\uecf8\\uecf9\\uecfa\\uecfb\\uecfc\\uecfd\\uecfe\\uecff\\ued00\\ued01\\ued02\\ued03\\ued04\\ued05\\ued06\\ued07\\ued08\\ued09\\ued0a\\ued0b\\ued0c\\ued0d\\ued0e\\ued0f\\ued10\\ued11\\ued12\\ued13\\ued14\\ued15\\ued16\\ued17\\ued18\\ued19\\ued1a\\ued1b\\ued1c\\ued1d\\ued1e\\ued1f\\ued20\\ued21\\ued22\\ued23\\ued24\\ued25\\ued26\\ued27\\ued28\\ued29\\ued2a\\ued2b\\ued2c\\ued2d\\ued2e\\ued2f\\ued30\\ued31\\ued32\\ued33\\ued34\\ued35\\ued36\\ued37\\ued38\\ued39\\ued3a\\ued3b\\ued3c\\ued3d\\ued3e\\ued3f\\ued40\\ued41\\ued42\\ued43\\ued44\\ued45\\ued46\\ued47\\ued48\\ued49\\ued4a\\ued4b\\ued4c\\ued4d\\ued4e\\ued4f\\ued50\\ued51\\ued52\\ued53\\ued54\\ued55\\ued56\\ued57\\ued58\\ued59\\ued5a\\ued5b\\ued5c\\ued5d\\ued5e\\ued5f\\ued60\\ued61\\ued62\\ued63\\ued64\\ued65\\ued66\\ued67\\ued68\\ued69\\ued6a\\ued6b\\ued6c\\ued6d\\ued6e\\ued6f\\ued70\\ued71\\ued72\\ued73\\ued74\\ued75\\ued76\\ued77\\ued78\\ued79\\ued7a\\ued7b\\ued7c\\ued7d\\ued7e\\ued7f\\ued80\\ued81\\ued82\\ued83\\ued84\\ued85\\ued86\\ued87\\ued88\\ued89\\ued8a\\ued8b\\ued8c\\ued8d\\ued8e\\ued8f\\ued90\\ued91\\ued92\\ued93\\ued94\\ued95\\ued96\\ued97\\ued98\\ued99\\ued9a\\ued9b\\ued9c\\ued9d\\ued9e\\ued9f\\ueda0\\ueda1\\ueda2\\ueda3\\ueda4\\ueda5\\ueda6\\ueda7\\ueda8\\ueda9\\uedaa\\uedab\\uedac\\uedad\\uedae\\uedaf\\uedb0\\uedb1\\uedb2\\uedb3\\uedb4\\uedb5\\uedb6\\uedb7\\uedb8\\uedb9\\uedba\\uedbb\\uedbc\\uedbd\\uedbe\\uedbf\\uedc0\\uedc1\\uedc2\\uedc3\\uedc4\\uedc5\\uedc6\\uedc7\\uedc8\\uedc9\\uedca\\uedcb\\uedcc\\uedcd\\uedce\\uedcf\\uedd0\\uedd1\\uedd2\\uedd3\\uedd4\\uedd5\\uedd6\\uedd7\\uedd8\\uedd9\\uedda\\ueddb\\ueddc\\ueddd\\uedde\\ueddf\\uede0\\uede1\\uede2\\uede3\\uede4\\uede5\\uede6\\uede7\\uede8\\uede9\\uedea\\uedeb\\uedec\\ueded\\uedee\\uedef\\uedf0\\uedf1\\uedf2\\uedf3\\uedf4\\uedf5\\uedf6\\uedf7\\uedf8\\uedf9\\uedfa\\uedfb\\uedfc\\uedfd\\uedfe\\uedff\\uee00\\uee01\\uee02\\uee03\\uee04\\uee05\\uee06\\uee07\\uee08\\uee09\\uee0a\\uee0b\\uee0c\\uee0d\\uee0e\\uee0f\\uee10\\uee11\\uee12\\uee13\\uee14\\uee15\\uee16\\uee17\\uee18\\uee19\\uee1a\\uee1b\\uee1c\\uee1d\\uee1e\\uee1f\\uee20\\uee21\\uee22\\uee23\\uee24\\uee25\\uee26\\uee27\\uee28\\uee29\\uee2a\\uee2b\\uee2c\\uee2d\\uee2e\\uee2f\\uee30\\uee31\\uee32\\uee33\\uee34\\uee35\\uee36\\uee37\\uee38\\uee39\\uee3a\\uee3b\\uee3c\\uee3d\\uee3e\\uee3f\\uee40\\uee41\\uee42\\uee43\\uee44\\uee45\\uee46\\uee47\\uee48\\uee49\\uee4a\\uee4b\\uee4c\\uee4d\\uee4e\\uee4f\\uee50\\uee51\\uee52\\uee53\\uee54\\uee55\\uee56\\uee57\\uee58\\uee59\\uee5a\\uee5b\\uee5c\\uee5d\\uee5e\\uee5f\\uee60\\uee61\\uee62\\uee63\\uee64\\uee65\\uee66\\uee67\\uee68\\uee69\\uee6a\\uee6b\\uee6c\\uee6d\\uee6e\\uee6f\\uee70\\uee71\\uee72\\uee73\\uee74\\uee75\\uee76\\uee77\\uee78\\uee79\\uee7a\\uee7b\\uee7c\\uee7d\\uee7e\\uee7f\\uee80\\uee81\\uee82\\uee83\\uee84\\uee85\\uee86\\uee87\\uee88\\uee89\\uee8a\\uee8b\\uee8c\\uee8d\\uee8e\\uee8f\\uee90\\uee91\\uee92\\uee93\\uee94\\uee95\\uee96\\uee97\\uee98\\uee99\\uee9a\\uee9b\\uee9c\\uee9d\\uee9e\\uee9f\\ueea0\\ueea1\\ueea2\\ueea3\\ueea4\\ueea5\\ueea6\\ueea7\\ueea8\\ueea9\\ueeaa\\ueeab\\ueeac\\ueead\\ueeae\\ueeaf\\ueeb0\\ueeb1\\ueeb2\\ueeb3\\ueeb4\\ueeb5\\ueeb6\\ueeb7\\ueeb8\\ueeb9\\ueeba\\ueebb\\ueebc\\ueebd\\ueebe\\ueebf\\ueec0\\ueec1\\ueec2\\ueec3\\ueec4\\ueec5\\ueec6\\ueec7\\ueec8\\ueec9\\ueeca\\ueecb\\ueecc\\ueecd\\ueece\\ueecf\\ueed0\\ueed1\\ueed2\\ueed3\\ueed4\\ueed5\\ueed6\\ueed7\\ueed8\\ueed9\\ueeda\\ueedb\\ueedc\\ueedd\\ueede\\ueedf\\ueee0\\ueee1\\ueee2\\ueee3\\ueee4\\ueee5\\ueee6\\ueee7\\ueee8\\ueee9\\ueeea\\ueeeb\\ueeec\\ueeed\\ueeee\\ueeef\\ueef0\\ueef1\\ueef2\\ueef3\\ueef4\\ueef5\\ueef6\\ueef7\\ueef8\\ueef9\\ueefa\\ueefb\\ueefc\\ueefd\\ueefe\\ueeff\\uef00\\uef01\\uef02\\uef03\\uef04\\uef05\\uef06\\uef07\\uef08\\uef09\\uef0a\\uef0b\\uef0c\\uef0d\\uef0e\\uef0f\\uef10\\uef11\\uef12\\uef13\\uef14\\uef15\\uef16\\uef17\\uef18\\uef19\\uef1a\\uef1b\\uef1c\\uef1d\\uef1e\\uef1f\\uef20\\uef21\\uef22\\uef23\\uef24\\uef25\\uef26\\uef27\\uef28\\uef29\\uef2a\\uef2b\\uef2c\\uef2d\\uef2e\\uef2f\\uef30\\uef31\\uef32\\uef33\\uef34\\uef35\\uef36\\uef37\\uef38\\uef39\\uef3a\\uef3b\\uef3c\\uef3d\\uef3e\\uef3f\\uef40\\uef41\\uef42\\uef43\\uef44\\uef45\\uef46\\uef47\\uef48\\uef49\\uef4a\\uef4b\\uef4c\\uef4d\\uef4e\\uef4f\\uef50\\uef51\\uef52\\uef53\\uef54\\uef55\\uef56\\uef57\\uef58\\uef59\\uef5a\\uef5b\\uef5c\\uef5d\\uef5e\\uef5f\\uef60\\uef61\\uef62\\uef63\\uef64\\uef65\\uef66\\uef67\\uef68\\uef69\\uef6a\\uef6b\\uef6c\\uef6d\\uef6e\\uef6f\\uef70\\uef71\\uef72\\uef73\\uef74\\uef75\\uef76\\uef77\\uef78\\uef79\\uef7a\\uef7b\\uef7c\\uef7d\\uef7e\\uef7f\\uef80\\uef81\\uef82\\uef83\\uef84\\uef85\\uef86\\uef87\\uef88\\uef89\\uef8a\\uef8b\\uef8c\\uef8d\\uef8e\\uef8f\\uef90\\uef91\\uef92\\uef93\\uef94\\uef95\\uef96\\uef97\\uef98\\uef99\\uef9a\\uef9b\\uef9c\\uef9d\\uef9e\\uef9f\\uefa0\\uefa1\\uefa2\\uefa3\\uefa4\\uefa5\\uefa6\\uefa7\\uefa8\\uefa9\\uefaa\\uefab\\uefac\\uefad\\uefae\\uefaf\\uefb0\\uefb1\\uefb2\\uefb3\\uefb4\\uefb5\\uefb6\\uefb7\\uefb8\\uefb9\\uefba\\uefbb\\uefbc\\uefbd\\uefbe\\uefbf\\uefc0\\uefc1\\uefc2\\uefc3\\uefc4\\uefc5\\uefc6\\uefc7\\uefc8\\uefc9\\uefca\\uefcb\\uefcc\\uefcd\\uefce\\uefcf\\uefd0\\uefd1\\uefd2\\uefd3\\uefd4\\uefd5\\uefd6\\uefd7\\uefd8\\uefd9\\uefda\\uefdb\\uefdc\\uefdd\\uefde\\uefdf\\uefe0\\uefe1\\uefe2\\uefe3\\uefe4\\uefe5\\uefe6\\uefe7\\uefe8\\uefe9\\uefea\\uefeb\\uefec\\uefed\\uefee\\uefef\\ueff0\\ueff1\\ueff2\\ueff3\\ueff4\\ueff5\\ueff6\\ueff7\\ueff8\\ueff9\\ueffa\\ueffb\\ueffc\\ueffd\\ueffe\\uefff\\uf000\\uf001\\uf002\\uf003\\uf004\\uf005\\uf006\\uf007\\uf008\\uf009\\uf00a\\uf00b\\uf00c\\uf00d\\uf00e\\uf00f\\uf010\\uf011\\uf012\\uf013\\uf014\\uf015\\uf016\\uf017\\uf018\\uf019\\uf01a\\uf01b\\uf01c\\uf01d\\uf01e\\uf01f\\uf020\\uf021\\uf022\\uf023\\uf024\\uf025\\uf026\\uf027\\uf028\\uf029\\uf02a\\uf02b\\uf02c\\uf02d\\uf02e\\uf02f\\uf030\\uf031\\uf032\\uf033\\uf034\\uf035\\uf036\\uf037\\uf038\\uf039\\uf03a\\uf03b\\uf03c\\uf03d\\uf03e\\uf03f\\uf040\\uf041\\uf042\\uf043\\uf044\\uf045\\uf046\\uf047\\uf048\\uf049\\uf04a\\uf04b\\uf04c\\uf04d\\uf04e\\uf04f\\uf050\\uf051\\uf052\\uf053\\uf054\\uf055\\uf056\\uf057\\uf058\\uf059\\uf05a\\uf05b\\uf05c\\uf05d\\uf05e\\uf05f\\uf060\\uf061\\uf062\\uf063\\uf064\\uf065\\uf066\\uf067\\uf068\\uf069\\uf06a\\uf06b\\uf06c\\uf06d\\uf06e\\uf06f\\uf070\\uf071\\uf072\\uf073\\uf074\\uf075\\uf076\\uf077\\uf078\\uf079\\uf07a\\uf07b\\uf07c\\uf07d\\uf07e\\uf07f\\uf080\\uf081\\uf082\\uf083\\uf084\\uf085\\uf086\\uf087\\uf088\\uf089\\uf08a\\uf08b\\uf08c\\uf08d\\uf08e\\uf08f\\uf090\\uf091\\uf092\\uf093\\uf094\\uf095\\uf096\\uf097\\uf098\\uf099\\uf09a\\uf09b\\uf09c\\uf09d\\uf09e\\uf09f\\uf0a0\\uf0a1\\uf0a2\\uf0a3\\uf0a4\\uf0a5\\uf0a6\\uf0a7\\uf0a8\\uf0a9\\uf0aa\\uf0ab\\uf0ac\\uf0ad\\uf0ae\\uf0af\\uf0b0\\uf0b1\\uf0b2\\uf0b3\\uf0b4\\uf0b5\\uf0b6\\uf0b7\\uf0b8\\uf0b9\\uf0ba\\uf0bb\\uf0bc\\uf0bd\\uf0be\\uf0bf\\uf0c0\\uf0c1\\uf0c2\\uf0c3\\uf0c4\\uf0c5\\uf0c6\\uf0c7\\uf0c8\\uf0c9\\uf0ca\\uf0cb\\uf0cc\\uf0cd\\uf0ce\\uf0cf\\uf0d0\\uf0d1\\uf0d2\\uf0d3\\uf0d4\\uf0d5\\uf0d6\\uf0d7\\uf0d8\\uf0d9\\uf0da\\uf0db\\uf0dc\\uf0dd\\uf0de\\uf0df\\uf0e0\\uf0e1\\uf0e2\\uf0e3\\uf0e4\\uf0e5\\uf0e6\\uf0e7\\uf0e8\\uf0e9\\uf0ea\\uf0eb\\uf0ec\\uf0ed\\uf0ee\\uf0ef\\uf0f0\\uf0f1\\uf0f2\\uf0f3\\uf0f4\\uf0f5\\uf0f6\\uf0f7\\uf0f8\\uf0f9\\uf0fa\\uf0fb\\uf0fc\\uf0fd\\uf0fe\\uf0ff\\uf100\\uf101\\uf102\\uf103\\uf104\\uf105\\uf106\\uf107\\uf108\\uf109\\uf10a\\uf10b\\uf10c\\uf10d\\uf10e\\uf10f\\uf110\\uf111\\uf112\\uf113\\uf114\\uf115\\uf116\\uf117\\uf118\\uf119\\uf11a\\uf11b\\uf11c\\uf11d\\uf11e\\uf11f\\uf120\\uf121\\uf122\\uf123\\uf124\\uf125\\uf126\\uf127\\uf128\\uf129\\uf12a\\uf12b\\uf12c\\uf12d\\uf12e\\uf12f\\uf130\\uf131\\uf132\\uf133\\uf134\\uf135\\uf136\\uf137\\uf138\\uf139\\uf13a\\uf13b\\uf13c\\uf13d\\uf13e\\uf13f\\uf140\\uf141\\uf142\\uf143\\uf144\\uf145\\uf146\\uf147\\uf148\\uf149\\uf14a\\uf14b\\uf14c\\uf14d\\uf14e\\uf14f\\uf150\\uf151\\uf152\\uf153\\uf154\\uf155\\uf156\\uf157\\uf158\\uf159\\uf15a\\uf15b\\uf15c\\uf15d\\uf15e\\uf15f\\uf160\\uf161\\uf162\\uf163\\uf164\\uf165\\uf166\\uf167\\uf168\\uf169\\uf16a\\uf16b\\uf16c\\uf16d\\uf16e\\uf16f\\uf170\\uf171\\uf172\\uf173\\uf174\\uf175\\uf176\\uf177\\uf178\\uf179\\uf17a\\uf17b\\uf17c\\uf17d\\uf17e\\uf17f\\uf180\\uf181\\uf182\\uf183\\uf184\\uf185\\uf186\\uf187\\uf188\\uf189\\uf18a\\uf18b\\uf18c\\uf18d\\uf18e\\uf18f\\uf190\\uf191\\uf192\\uf193\\uf194\\uf195\\uf196\\uf197\\uf198\\uf199\\uf19a\\uf19b\\uf19c\\uf19d\\uf19e\\uf19f\\uf1a0\\uf1a1\\uf1a2\\uf1a3\\uf1a4\\uf1a5\\uf1a6\\uf1a7\\uf1a8\\uf1a9\\uf1aa\\uf1ab\\uf1ac\\uf1ad\\uf1ae\\uf1af\\uf1b0\\uf1b1\\uf1b2\\uf1b3\\uf1b4\\uf1b5\\uf1b6\\uf1b7\\uf1b8\\uf1b9\\uf1ba\\uf1bb\\uf1bc\\uf1bd\\uf1be\\uf1bf\\uf1c0\\uf1c1\\uf1c2\\uf1c3\\uf1c4\\uf1c5\\uf1c6\\uf1c7\\uf1c8\\uf1c9\\uf1ca\\uf1cb\\uf1cc\\uf1cd\\uf1ce\\uf1cf\\uf1d0\\uf1d1\\uf1d2\\uf1d3\\uf1d4\\uf1d5\\uf1d6\\uf1d7\\uf1d8\\uf1d9\\uf1da\\uf1db\\uf1dc\\uf1dd\\uf1de\\uf1df\\uf1e0\\uf1e1\\uf1e2\\uf1e3\\uf1e4\\uf1e5\\uf1e6\\uf1e7\\uf1e8\\uf1e9\\uf1ea\\uf1eb\\uf1ec\\uf1ed\\uf1ee\\uf1ef\\uf1f0\\uf1f1\\uf1f2\\uf1f3\\uf1f4\\uf1f5\\uf1f6\\uf1f7\\uf1f8\\uf1f9\\uf1fa\\uf1fb\\uf1fc\\uf1fd\\uf1fe\\uf1ff\\uf200\\uf201\\uf202\\uf203\\uf204\\uf205\\uf206\\uf207\\uf208\\uf209\\uf20a\\uf20b\\uf20c\\uf20d\\uf20e\\uf20f\\uf210\\uf211\\uf212\\uf213\\uf214\\uf215\\uf216\\uf217\\uf218\\uf219\\uf21a\\uf21b\\uf21c\\uf21d\\uf21e\\uf21f\\uf220\\uf221\\uf222\\uf223\\uf224\\uf225\\uf226\\uf227\\uf228\\uf229\\uf22a\\uf22b\\uf22c\\uf22d\\uf22e\\uf22f\\uf230\\uf231\\uf232\\uf233\\uf234\\uf235\\uf236\\uf237\\uf238\\uf239\\uf23a\\uf23b\\uf23c\\uf23d\\uf23e\\uf23f\\uf240\\uf241\\uf242\\uf243\\uf244\\uf245\\uf246\\uf247\\uf248\\uf249\\uf24a\\uf24b\\uf24c\\uf24d\\uf24e\\uf24f\\uf250\\uf251\\uf252\\uf253\\uf254\\uf255\\uf256\\uf257\\uf258\\uf259\\uf25a\\uf25b\\uf25c\\uf25d\\uf25e\\uf25f\\uf260\\uf261\\uf262\\uf263\\uf264\\uf265\\uf266\\uf267\\uf268\\uf269\\uf26a\\uf26b\\uf26c\\uf26d\\uf26e\\uf26f\\uf270\\uf271\\uf272\\uf273\\uf274\\uf275\\uf276\\uf277\\uf278\\uf279\\uf27a\\uf27b\\uf27c\\uf27d\\uf27e\\uf27f\\uf280\\uf281\\uf282\\uf283\\uf284\\uf285\\uf286\\uf287\\uf288\\uf289\\uf28a\\uf28b\\uf28c\\uf28d\\uf28e\\uf28f\\uf290\\uf291\\uf292\\uf293\\uf294\\uf295\\uf296\\uf297\\uf298\\uf299\\uf29a\\uf29b\\uf29c\\uf29d\\uf29e\\uf29f\\uf2a0\\uf2a1\\uf2a2\\uf2a3\\uf2a4\\uf2a5\\uf2a6\\uf2a7\\uf2a8\\uf2a9\\uf2aa\\uf2ab\\uf2ac\\uf2ad\\uf2ae\\uf2af\\uf2b0\\uf2b1\\uf2b2\\uf2b3\\uf2b4\\uf2b5\\uf2b6\\uf2b7\\uf2b8\\uf2b9\\uf2ba\\uf2bb\\uf2bc\\uf2bd\\uf2be\\uf2bf\\uf2c0\\uf2c1\\uf2c2\\uf2c3\\uf2c4\\uf2c5\\uf2c6\\uf2c7\\uf2c8\\uf2c9\\uf2ca\\uf2cb\\uf2cc\\uf2cd\\uf2ce\\uf2cf\\uf2d0\\uf2d1\\uf2d2\\uf2d3\\uf2d4\\uf2d5\\uf2d6\\uf2d7\\uf2d8\\uf2d9\\uf2da\\uf2db\\uf2dc\\uf2dd\\uf2de\\uf2df\\uf2e0\\uf2e1\\uf2e2\\uf2e3\\uf2e4\\uf2e5\\uf2e6\\uf2e7\\uf2e8\\uf2e9\\uf2ea\\uf2eb\\uf2ec\\uf2ed\\uf2ee\\uf2ef\\uf2f0\\uf2f1\\uf2f2\\uf2f3\\uf2f4\\uf2f5\\uf2f6\\uf2f7\\uf2f8\\uf2f9\\uf2fa\\uf2fb\\uf2fc\\uf2fd\\uf2fe\\uf2ff\\uf300\\uf301\\uf302\\uf303\\uf304\\uf305\\uf306\\uf307\\uf308\\uf309\\uf30a\\uf30b\\uf30c\\uf30d\\uf30e\\uf30f\\uf310\\uf311\\uf312\\uf313\\uf314\\uf315\\uf316\\uf317\\uf318\\uf319\\uf31a\\uf31b\\uf31c\\uf31d\\uf31e\\uf31f\\uf320\\uf321\\uf322\\uf323\\uf324\\uf325\\uf326\\uf327\\uf328\\uf329\\uf32a\\uf32b\\uf32c\\uf32d\\uf32e\\uf32f\\uf330\\uf331\\uf332\\uf333\\uf334\\uf335\\uf336\\uf337\\uf338\\uf339\\uf33a\\uf33b\\uf33c\\uf33d\\uf33e\\uf33f\\uf340\\uf341\\uf342\\uf343\\uf344\\uf345\\uf346\\uf347\\uf348\\uf349\\uf34a\\uf34b\\uf34c\\uf34d\\uf34e\\uf34f\\uf350\\uf351\\uf352\\uf353\\uf354\\uf355\\uf356\\uf357\\uf358\\uf359\\uf35a\\uf35b\\uf35c\\uf35d\\uf35e\\uf35f\\uf360\\uf361\\uf362\\uf363\\uf364\\uf365\\uf366\\uf367\\uf368\\uf369\\uf36a\\uf36b\\uf36c\\uf36d\\uf36e\\uf36f\\uf370\\uf371\\uf372\\uf373\\uf374\\uf375\\uf376\\uf377\\uf378\\uf379\\uf37a\\uf37b\\uf37c\\uf37d\\uf37e\\uf37f\\uf380\\uf381\\uf382\\uf383\\uf384\\uf385\\uf386\\uf387\\uf388\\uf389\\uf38a\\uf38b\\uf38c\\uf38d\\uf38e\\uf38f\\uf390\\uf391\\uf392\\uf393\\uf394\\uf395\\uf396\\uf397\\uf398\\uf399\\uf39a\\uf39b\\uf39c\\uf39d\\uf39e\\uf39f\\uf3a0\\uf3a1\\uf3a2\\uf3a3\\uf3a4\\uf3a5\\uf3a6\\uf3a7\\uf3a8\\uf3a9\\uf3aa\\uf3ab\\uf3ac\\uf3ad\\uf3ae\\uf3af\\uf3b0\\uf3b1\\uf3b2\\uf3b3\\uf3b4\\uf3b5\\uf3b6\\uf3b7\\uf3b8\\uf3b9\\uf3ba\\uf3bb\\uf3bc\\uf3bd\\uf3be\\uf3bf\\uf3c0\\uf3c1\\uf3c2\\uf3c3\\uf3c4\\uf3c5\\uf3c6\\uf3c7\\uf3c8\\uf3c9\\uf3ca\\uf3cb\\uf3cc\\uf3cd\\uf3ce\\uf3cf\\uf3d0\\uf3d1\\uf3d2\\uf3d3\\uf3d4\\uf3d5\\uf3d6\\uf3d7\\uf3d8\\uf3d9\\uf3da\\uf3db\\uf3dc\\uf3dd\\uf3de\\uf3df\\uf3e0\\uf3e1\\uf3e2\\uf3e3\\uf3e4\\uf3e5\\uf3e6\\uf3e7\\uf3e8\\uf3e9\\uf3ea\\uf3eb\\uf3ec\\uf3ed\\uf3ee\\uf3ef\\uf3f0\\uf3f1\\uf3f2\\uf3f3\\uf3f4\\uf3f5\\uf3f6\\uf3f7\\uf3f8\\uf3f9\\uf3fa\\uf3fb\\uf3fc\\uf3fd\\uf3fe\\uf3ff\\uf400\\uf401\\uf402\\uf403\\uf404\\uf405\\uf406\\uf407\\uf408\\uf409\\uf40a\\uf40b\\uf40c\\uf40d\\uf40e\\uf40f\\uf410\\uf411\\uf412\\uf413\\uf414\\uf415\\uf416\\uf417\\uf418\\uf419\\uf41a\\uf41b\\uf41c\\uf41d\\uf41e\\uf41f\\uf420\\uf421\\uf422\\uf423\\uf424\\uf425\\uf426\\uf427\\uf428\\uf429\\uf42a\\uf42b\\uf42c\\uf42d\\uf42e\\uf42f\\uf430\\uf431\\uf432\\uf433\\uf434\\uf435\\uf436\\uf437\\uf438\\uf439\\uf43a\\uf43b\\uf43c\\uf43d\\uf43e\\uf43f\\uf440\\uf441\\uf442\\uf443\\uf444\\uf445\\uf446\\uf447\\uf448\\uf449\\uf44a\\uf44b\\uf44c\\uf44d\\uf44e\\uf44f\\uf450\\uf451\\uf452\\uf453\\uf454\\uf455\\uf456\\uf457\\uf458\\uf459\\uf45a\\uf45b\\uf45c\\uf45d\\uf45e\\uf45f\\uf460\\uf461\\uf462\\uf463\\uf464\\uf465\\uf466\\uf467\\uf468\\uf469\\uf46a\\uf46b\\uf46c\\uf46d\\uf46e\\uf46f\\uf470\\uf471\\uf472\\uf473\\uf474\\uf475\\uf476\\uf477\\uf478\\uf479\\uf47a\\uf47b\\uf47c\\uf47d\\uf47e\\uf47f\\uf480\\uf481\\uf482\\uf483\\uf484\\uf485\\uf486\\uf487\\uf488\\uf489\\uf48a\\uf48b\\uf48c\\uf48d\\uf48e\\uf48f\\uf490\\uf491\\uf492\\uf493\\uf494\\uf495\\uf496\\uf497\\uf498\\uf499\\uf49a\\uf49b\\uf49c\\uf49d\\uf49e\\uf49f\\uf4a0\\uf4a1\\uf4a2\\uf4a3\\uf4a4\\uf4a5\\uf4a6\\uf4a7\\uf4a8\\uf4a9\\uf4aa\\uf4ab\\uf4ac\\uf4ad\\uf4ae\\uf4af\\uf4b0\\uf4b1\\uf4b2\\uf4b3\\uf4b4\\uf4b5\\uf4b6\\uf4b7\\uf4b8\\uf4b9\\uf4ba\\uf4bb\\uf4bc\\uf4bd\\uf4be\\uf4bf\\uf4c0\\uf4c1\\uf4c2\\uf4c3\\uf4c4\\uf4c5\\uf4c6\\uf4c7\\uf4c8\\uf4c9\\uf4ca\\uf4cb\\uf4cc\\uf4cd\\uf4ce\\uf4cf\\uf4d0\\uf4d1\\uf4d2\\uf4d3\\uf4d4\\uf4d5\\uf4d6\\uf4d7\\uf4d8\\uf4d9\\uf4da\\uf4db\\uf4dc\\uf4dd\\uf4de\\uf4df\\uf4e0\\uf4e1\\uf4e2\\uf4e3\\uf4e4\\uf4e5\\uf4e6\\uf4e7\\uf4e8\\uf4e9\\uf4ea\\uf4eb\\uf4ec\\uf4ed\\uf4ee\\uf4ef\\uf4f0\\uf4f1\\uf4f2\\uf4f3\\uf4f4\\uf4f5\\uf4f6\\uf4f7\\uf4f8\\uf4f9\\uf4fa\\uf4fb\\uf4fc\\uf4fd\\uf4fe\\uf4ff\\uf500\\uf501\\uf502\\uf503\\uf504\\uf505\\uf506\\uf507\\uf508\\uf509\\uf50a\\uf50b\\uf50c\\uf50d\\uf50e\\uf50f\\uf510\\uf511\\uf512\\uf513\\uf514\\uf515\\uf516\\uf517\\uf518\\uf519\\uf51a\\uf51b\\uf51c\\uf51d\\uf51e\\uf51f\\uf520\\uf521\\uf522\\uf523\\uf524\\uf525\\uf526\\uf527\\uf528\\uf529\\uf52a\\uf52b\\uf52c\\uf52d\\uf52e\\uf52f\\uf530\\uf531\\uf532\\uf533\\uf534\\uf535\\uf536\\uf537\\uf538\\uf539\\uf53a\\uf53b\\uf53c\\uf53d\\uf53e\\uf53f\\uf540\\uf541\\uf542\\uf543\\uf544\\uf545\\uf546\\uf547\\uf548\\uf549\\uf54a\\uf54b\\uf54c\\uf54d\\uf54e\\uf54f\\uf550\\uf551\\uf552\\uf553\\uf554\\uf555\\uf556\\uf557\\uf558\\uf559\\uf55a\\uf55b\\uf55c\\uf55d\\uf55e\\uf55f\\uf560\\uf561\\uf562\\uf563\\uf564\\uf565\\uf566\\uf567\\uf568\\uf569\\uf56a\\uf56b\\uf56c\\uf56d\\uf56e\\uf56f\\uf570\\uf571\\uf572\\uf573\\uf574\\uf575\\uf576\\uf577\\uf578\\uf579\\uf57a\\uf57b\\uf57c\\uf57d\\uf57e\\uf57f\\uf580\\uf581\\uf582\\uf583\\uf584\\uf585\\uf586\\uf587\\uf588\\uf589\\uf58a\\uf58b\\uf58c\\uf58d\\uf58e\\uf58f\\uf590\\uf591\\uf592\\uf593\\uf594\\uf595\\uf596\\uf597\\uf598\\uf599\\uf59a\\uf59b\\uf59c\\uf59d\\uf59e\\uf59f\\uf5a0\\uf5a1\\uf5a2\\uf5a3\\uf5a4\\uf5a5\\uf5a6\\uf5a7\\uf5a8\\uf5a9\\uf5aa\\uf5ab\\uf5ac\\uf5ad\\uf5ae\\uf5af\\uf5b0\\uf5b1\\uf5b2\\uf5b3\\uf5b4\\uf5b5\\uf5b6\\uf5b7\\uf5b8\\uf5b9\\uf5ba\\uf5bb\\uf5bc\\uf5bd\\uf5be\\uf5bf\\uf5c0\\uf5c1\\uf5c2\\uf5c3\\uf5c4\\uf5c5\\uf5c6\\uf5c7\\uf5c8\\uf5c9\\uf5ca\\uf5cb\\uf5cc\\uf5cd\\uf5ce\\uf5cf\\uf5d0\\uf5d1\\uf5d2\\uf5d3\\uf5d4\\uf5d5\\uf5d6\\uf5d7\\uf5d8\\uf5d9\\uf5da\\uf5db\\uf5dc\\uf5dd\\uf5de\\uf5df\\uf5e0\\uf5e1\\uf5e2\\uf5e3\\uf5e4\\uf5e5\\uf5e6\\uf5e7\\uf5e8\\uf5e9\\uf5ea\\uf5eb\\uf5ec\\uf5ed\\uf5ee\\uf5ef\\uf5f0\\uf5f1\\uf5f2\\uf5f3\\uf5f4\\uf5f5\\uf5f6\\uf5f7\\uf5f8\\uf5f9\\uf5fa\\uf5fb\\uf5fc\\uf5fd\\uf5fe\\uf5ff\\uf600\\uf601\\uf602\\uf603\\uf604\\uf605\\uf606\\uf607\\uf608\\uf609\\uf60a\\uf60b\\uf60c\\uf60d\\uf60e\\uf60f\\uf610\\uf611\\uf612\\uf613\\uf614\\uf615\\uf616\\uf617\\uf618\\uf619\\uf61a\\uf61b\\uf61c\\uf61d\\uf61e\\uf61f\\uf620\\uf621\\uf622\\uf623\\uf624\\uf625\\uf626\\uf627\\uf628\\uf629\\uf62a\\uf62b\\uf62c\\uf62d\\uf62e\\uf62f\\uf630\\uf631\\uf632\\uf633\\uf634\\uf635\\uf636\\uf637\\uf638\\uf639\\uf63a\\uf63b\\uf63c\\uf63d\\uf63e\\uf63f\\uf640\\uf641\\uf642\\uf643\\uf644\\uf645\\uf646\\uf647\\uf648\\uf649\\uf64a\\uf64b\\uf64c\\uf64d\\uf64e\\uf64f\\uf650\\uf651\\uf652\\uf653\\uf654\\uf655\\uf656\\uf657\\uf658\\uf659\\uf65a\\uf65b\\uf65c\\uf65d\\uf65e\\uf65f\\uf660\\uf661\\uf662\\uf663\\uf664\\uf665\\uf666\\uf667\\uf668\\uf669\\uf66a\\uf66b\\uf66c\\uf66d\\uf66e\\uf66f\\uf670\\uf671\\uf672\\uf673\\uf674\\uf675\\uf676\\uf677\\uf678\\uf679\\uf67a\\uf67b\\uf67c\\uf67d\\uf67e\\uf67f\\uf680\\uf681\\uf682\\uf683\\uf684\\uf685\\uf686\\uf687\\uf688\\uf689\\uf68a\\uf68b\\uf68c\\uf68d\\uf68e\\uf68f\\uf690\\uf691\\uf692\\uf693\\uf694\\uf695\\uf696\\uf697\\uf698\\uf699\\uf69a\\uf69b\\uf69c\\uf69d\\uf69e\\uf69f\\uf6a0\\uf6a1\\uf6a2\\uf6a3\\uf6a4\\uf6a5\\uf6a6\\uf6a7\\uf6a8\\uf6a9\\uf6aa\\uf6ab\\uf6ac\\uf6ad\\uf6ae\\uf6af\\uf6b0\\uf6b1\\uf6b2\\uf6b3\\uf6b4\\uf6b5\\uf6b6\\uf6b7\\uf6b8\\uf6b9\\uf6ba\\uf6bb\\uf6bc\\uf6bd\\uf6be\\uf6bf\\uf6c0\\uf6c1\\uf6c2\\uf6c3\\uf6c4\\uf6c5\\uf6c6\\uf6c7\\uf6c8\\uf6c9\\uf6ca\\uf6cb\\uf6cc\\uf6cd\\uf6ce\\uf6cf\\uf6d0\\uf6d1\\uf6d2\\uf6d3\\uf6d4\\uf6d5\\uf6d6\\uf6d7\\uf6d8\\uf6d9\\uf6da\\uf6db\\uf6dc\\uf6dd\\uf6de\\uf6df\\uf6e0\\uf6e1\\uf6e2\\uf6e3\\uf6e4\\uf6e5\\uf6e6\\uf6e7\\uf6e8\\uf6e9\\uf6ea\\uf6eb\\uf6ec\\uf6ed\\uf6ee\\uf6ef\\uf6f0\\uf6f1\\uf6f2\\uf6f3\\uf6f4\\uf6f5\\uf6f6\\uf6f7\\uf6f8\\uf6f9\\uf6fa\\uf6fb\\uf6fc\\uf6fd\\uf6fe\\uf6ff\\uf700\\uf701\\uf702\\uf703\\uf704\\uf705\\uf706\\uf707\\uf708\\uf709\\uf70a\\uf70b\\uf70c\\uf70d\\uf70e\\uf70f\\uf710\\uf711\\uf712\\uf713\\uf714\\uf715\\uf716\\uf717\\uf718\\uf719\\uf71a\\uf71b\\uf71c\\uf71d\\uf71e\\uf71f\\uf720\\uf721\\uf722\\uf723\\uf724\\uf725\\uf726\\uf727\\uf728\\uf729\\uf72a\\uf72b\\uf72c\\uf72d\\uf72e\\uf72f\\uf730\\uf731\\uf732\\uf733\\uf734\\uf735\\uf736\\uf737\\uf738\\uf739\\uf73a\\uf73b\\uf73c\\uf73d\\uf73e\\uf73f\\uf740\\uf741\\uf742\\uf743\\uf744\\uf745\\uf746\\uf747\\uf748\\uf749\\uf74a\\uf74b\\uf74c\\uf74d\\uf74e\\uf74f\\uf750\\uf751\\uf752\\uf753\\uf754\\uf755\\uf756\\uf757\\uf758\\uf759\\uf75a\\uf75b\\uf75c\\uf75d\\uf75e\\uf75f\\uf760\\uf761\\uf762\\uf763\\uf764\\uf765\\uf766\\uf767\\uf768\\uf769\\uf76a\\uf76b\\uf76c\\uf76d\\uf76e\\uf76f\\uf770\\uf771\\uf772\\uf773\\uf774\\uf775\\uf776\\uf777\\uf778\\uf779\\uf77a\\uf77b\\uf77c\\uf77d\\uf77e\\uf77f\\uf780\\uf781\\uf782\\uf783\\uf784\\uf785\\uf786\\uf787\\uf788\\uf789\\uf78a\\uf78b\\uf78c\\uf78d\\uf78e\\uf78f\\uf790\\uf791\\uf792\\uf793\\uf794\\uf795\\uf796\\uf797\\uf798\\uf799\\uf79a\\uf79b\\uf79c\\uf79d\\uf79e\\uf79f\\uf7a0\\uf7a1\\uf7a2\\uf7a3\\uf7a4\\uf7a5\\uf7a6\\uf7a7\\uf7a8\\uf7a9\\uf7aa\\uf7ab\\uf7ac\\uf7ad\\uf7ae\\uf7af\\uf7b0\\uf7b1\\uf7b2\\uf7b3\\uf7b4\\uf7b5\\uf7b6\\uf7b7\\uf7b8\\uf7b9\\uf7ba\\uf7bb\\uf7bc\\uf7bd\\uf7be\\uf7bf\\uf7c0\\uf7c1\\uf7c2\\uf7c3\\uf7c4\\uf7c5\\uf7c6\\uf7c7\\uf7c8\\uf7c9\\uf7ca\\uf7cb\\uf7cc\\uf7cd\\uf7ce\\uf7cf\\uf7d0\\uf7d1\\uf7d2\\uf7d3\\uf7d4\\uf7d5\\uf7d6\\uf7d7\\uf7d8\\uf7d9\\uf7da\\uf7db\\uf7dc\\uf7dd\\uf7de\\uf7df\\uf7e0\\uf7e1\\uf7e2\\uf7e3\\uf7e4\\uf7e5\\uf7e6\\uf7e7\\uf7e8\\uf7e9\\uf7ea\\uf7eb\\uf7ec\\uf7ed\\uf7ee\\uf7ef\\uf7f0\\uf7f1\\uf7f2\\uf7f3\\uf7f4\\uf7f5\\uf7f6\\uf7f7\\uf7f8\\uf7f9\\uf7fa\\uf7fb\\uf7fc\\uf7fd\\uf7fe\\uf7ff\\uf800\\uf801\\uf802\\uf803\\uf804\\uf805\\uf806\\uf807\\uf808\\uf809\\uf80a\\uf80b\\uf80c\\uf80d\\uf80e\\uf80f\\uf810\\uf811\\uf812\\uf813\\uf814\\uf815\\uf816\\uf817\\uf818\\uf819\\uf81a\\uf81b\\uf81c\\uf81d\\uf81e\\uf81f\\uf820\\uf821\\uf822\\uf823\\uf824\\uf825\\uf826\\uf827\\uf828\\uf829\\uf82a\\uf82b\\uf82c\\uf82d\\uf82e\\uf82f\\uf830\\uf831\\uf832\\uf833\\uf834\\uf835\\uf836\\uf837\\uf838\\uf839\\uf83a\\uf83b\\uf83c\\uf83d\\uf83e\\uf83f\\uf840\\uf841\\uf842\\uf843\\uf844\\uf845\\uf846\\uf847\\uf848\\uf849\\uf84a\\uf84b\\uf84c\\uf84d\\uf84e\\uf84f\\uf850\\uf851\\uf852\\uf853\\uf854\\uf855\\uf856\\uf857\\uf858\\uf859\\uf85a\\uf85b\\uf85c\\uf85d\\uf85e\\uf85f\\uf860\\uf861\\uf862\\uf863\\uf864\\uf865\\uf866\\uf867\\uf868\\uf869\\uf86a\\uf86b\\uf86c\\uf86d\\uf86e\\uf86f\\uf870\\uf871\\uf872\\uf873\\uf874\\uf875\\uf876\\uf877\\uf878\\uf879\\uf87a\\uf87b\\uf87c\\uf87d\\uf87e\\uf87f\\uf880\\uf881\\uf882\\uf883\\uf884\\uf885\\uf886\\uf887\\uf888\\uf889\\uf88a\\uf88b\\uf88c\\uf88d\\uf88e\\uf88f\\uf890\\uf891\\uf892\\uf893\\uf894\\uf895\\uf896\\uf897\\uf898\\uf899\\uf89a\\uf89b\\uf89c\\uf89d\\uf89e\\uf89f\\uf8a0\\uf8a1\\uf8a2\\uf8a3\\uf8a4\\uf8a5\\uf8a6\\uf8a7\\uf8a8\\uf8a9\\uf8aa\\uf8ab\\uf8ac\\uf8ad\\uf8ae\\uf8af\\uf8b0\\uf8b1\\uf8b2\\uf8b3\\uf8b4\\uf8b5\\uf8b6\\uf8b7\\uf8b8\\uf8b9\\uf8ba\\uf8bb\\uf8bc\\uf8bd\\uf8be\\uf8bf\\uf8c0\\uf8c1\\uf8c2\\uf8c3\\uf8c4\\uf8c5\\uf8c6\\uf8c7\\uf8c8\\uf8c9\\uf8ca\\uf8cb\\uf8cc\\uf8cd\\uf8ce\\uf8cf\\uf8d0\\uf8d1\\uf8d2\\uf8d3\\uf8d4\\uf8d5\\uf8d6\\uf8d7\\uf8d8\\uf8d9\\uf8da\\uf8db\\uf8dc\\uf8dd\\uf8de\\uf8df\\uf8e0\\uf8e1\\uf8e2\\uf8e3\\uf8e4\\uf8e5\\uf8e6\\uf8e7\\uf8e8\\uf8e9\\uf8ea\\uf8eb\\uf8ec\\uf8ed\\uf8ee\\uf8ef\\uf8f0\\uf8f1\\uf8f2\\uf8f3\\uf8f4\\uf8f5\\uf8f6\\uf8f7\\uf8f8\\uf8f9\\uf8fa\\uf8fb\\uf8fc\\uf8fd\\uf8fe\\uf8ff'\n\ntry:\n    Cs = eval(r\"'\\ud800\\ud801\\ud802\\ud803\\ud804\\ud805\\ud806\\ud807\\ud808\\ud809\\ud80a\\ud80b\\ud80c\\ud80d\\ud80e\\ud80f\\ud810\\ud811\\ud812\\ud813\\ud814\\ud815\\ud816\\ud817\\ud818\\ud819\\ud81a\\ud81b\\ud81c\\ud81d\\ud81e\\ud81f\\ud820\\ud821\\ud822\\ud823\\ud824\\ud825\\ud826\\ud827\\ud828\\ud829\\ud82a\\ud82b\\ud82c\\ud82d\\ud82e\\ud82f\\ud830\\ud831\\ud832\\ud833\\ud834\\ud835\\ud836\\ud837\\ud838\\ud839\\ud83a\\ud83b\\ud83c\\ud83d\\ud83e\\ud83f\\ud840\\ud841\\ud842\\ud843\\ud844\\ud845\\ud846\\ud847\\ud848\\ud849\\ud84a\\ud84b\\ud84c\\ud84d\\ud84e\\ud84f\\ud850\\ud851\\ud852\\ud853\\ud854\\ud855\\ud856\\ud857\\ud858\\ud859\\ud85a\\ud85b\\ud85c\\ud85d\\ud85e\\ud85f\\ud860\\ud861\\ud862\\ud863\\ud864\\ud865\\ud866\\ud867\\ud868\\ud869\\ud86a\\ud86b\\ud86c\\ud86d\\ud86e\\ud86f\\ud870\\ud871\\ud872\\ud873\\ud874\\ud875\\ud876\\ud877\\ud878\\ud879\\ud87a\\ud87b\\ud87c\\ud87d\\ud87e\\ud87f\\ud880\\ud881\\ud882\\ud883\\ud884\\ud885\\ud886\\ud887\\ud888\\ud889\\ud88a\\ud88b\\ud88c\\ud88d\\ud88e\\ud88f\\ud890\\ud891\\ud892\\ud893\\ud894\\ud895\\ud896\\ud897\\ud898\\ud899\\ud89a\\ud89b\\ud89c\\ud89d\\ud89e\\ud89f\\ud8a0\\ud8a1\\ud8a2\\ud8a3\\ud8a4\\ud8a5\\ud8a6\\ud8a7\\ud8a8\\ud8a9\\ud8aa\\ud8ab\\ud8ac\\ud8ad\\ud8ae\\ud8af\\ud8b0\\ud8b1\\ud8b2\\ud8b3\\ud8b4\\ud8b5\\ud8b6\\ud8b7\\ud8b8\\ud8b9\\ud8ba\\ud8bb\\ud8bc\\ud8bd\\ud8be\\ud8bf\\ud8c0\\ud8c1\\ud8c2\\ud8c3\\ud8c4\\ud8c5\\ud8c6\\ud8c7\\ud8c8\\ud8c9\\ud8ca\\ud8cb\\ud8cc\\ud8cd\\ud8ce\\ud8cf\\ud8d0\\ud8d1\\ud8d2\\ud8d3\\ud8d4\\ud8d5\\ud8d6\\ud8d7\\ud8d8\\ud8d9\\ud8da\\ud8db\\ud8dc\\ud8dd\\ud8de\\ud8df\\ud8e0\\ud8e1\\ud8e2\\ud8e3\\ud8e4\\ud8e5\\ud8e6\\ud8e7\\ud8e8\\ud8e9\\ud8ea\\ud8eb\\ud8ec\\ud8ed\\ud8ee\\ud8ef\\ud8f0\\ud8f1\\ud8f2\\ud8f3\\ud8f4\\ud8f5\\ud8f6\\ud8f7\\ud8f8\\ud8f9\\ud8fa\\ud8fb\\ud8fc\\ud8fd\\ud8fe\\ud8ff\\ud900\\ud901\\ud902\\ud903\\ud904\\ud905\\ud906\\ud907\\ud908\\ud909\\ud90a\\ud90b\\ud90c\\ud90d\\ud90e\\ud90f\\ud910\\ud911\\ud912\\ud913\\ud914\\ud915\\ud916\\ud917\\ud918\\ud919\\ud91a\\ud91b\\ud91c\\ud91d\\ud91e\\ud91f\\ud920\\ud921\\ud922\\ud923\\ud924\\ud925\\ud926\\ud927\\ud928\\ud929\\ud92a\\ud92b\\ud92c\\ud92d\\ud92e\\ud92f\\ud930\\ud931\\ud932\\ud933\\ud934\\ud935\\ud936\\ud937\\ud938\\ud939\\ud93a\\ud93b\\ud93c\\ud93d\\ud93e\\ud93f\\ud940\\ud941\\ud942\\ud943\\ud944\\ud945\\ud946\\ud947\\ud948\\ud949\\ud94a\\ud94b\\ud94c\\ud94d\\ud94e\\ud94f\\ud950\\ud951\\ud952\\ud953\\ud954\\ud955\\ud956\\ud957\\ud958\\ud959\\ud95a\\ud95b\\ud95c\\ud95d\\ud95e\\ud95f\\ud960\\ud961\\ud962\\ud963\\ud964\\ud965\\ud966\\ud967\\ud968\\ud969\\ud96a\\ud96b\\ud96c\\ud96d\\ud96e\\ud96f\\ud970\\ud971\\ud972\\ud973\\ud974\\ud975\\ud976\\ud977\\ud978\\ud979\\ud97a\\ud97b\\ud97c\\ud97d\\ud97e\\ud97f\\ud980\\ud981\\ud982\\ud983\\ud984\\ud985\\ud986\\ud987\\ud988\\ud989\\ud98a\\ud98b\\ud98c\\ud98d\\ud98e\\ud98f\\ud990\\ud991\\ud992\\ud993\\ud994\\ud995\\ud996\\ud997\\ud998\\ud999\\ud99a\\ud99b\\ud99c\\ud99d\\ud99e\\ud99f\\ud9a0\\ud9a1\\ud9a2\\ud9a3\\ud9a4\\ud9a5\\ud9a6\\ud9a7\\ud9a8\\ud9a9\\ud9aa\\ud9ab\\ud9ac\\ud9ad\\ud9ae\\ud9af\\ud9b0\\ud9b1\\ud9b2\\ud9b3\\ud9b4\\ud9b5\\ud9b6\\ud9b7\\ud9b8\\ud9b9\\ud9ba\\ud9bb\\ud9bc\\ud9bd\\ud9be\\ud9bf\\ud9c0\\ud9c1\\ud9c2\\ud9c3\\ud9c4\\ud9c5\\ud9c6\\ud9c7\\ud9c8\\ud9c9\\ud9ca\\ud9cb\\ud9cc\\ud9cd\\ud9ce\\ud9cf\\ud9d0\\ud9d1\\ud9d2\\ud9d3\\ud9d4\\ud9d5\\ud9d6\\ud9d7\\ud9d8\\ud9d9\\ud9da\\ud9db\\ud9dc\\ud9dd\\ud9de\\ud9df\\ud9e0\\ud9e1\\ud9e2\\ud9e3\\ud9e4\\ud9e5\\ud9e6\\ud9e7\\ud9e8\\ud9e9\\ud9ea\\ud9eb\\ud9ec\\ud9ed\\ud9ee\\ud9ef\\ud9f0\\ud9f1\\ud9f2\\ud9f3\\ud9f4\\ud9f5\\ud9f6\\ud9f7\\ud9f8\\ud9f9\\ud9fa\\ud9fb\\ud9fc\\ud9fd\\ud9fe\\ud9ff\\uda00\\uda01\\uda02\\uda03\\uda04\\uda05\\uda06\\uda07\\uda08\\uda09\\uda0a\\uda0b\\uda0c\\uda0d\\uda0e\\uda0f\\uda10\\uda11\\uda12\\uda13\\uda14\\uda15\\uda16\\uda17\\uda18\\uda19\\uda1a\\uda1b\\uda1c\\uda1d\\uda1e\\uda1f\\uda20\\uda21\\uda22\\uda23\\uda24\\uda25\\uda26\\uda27\\uda28\\uda29\\uda2a\\uda2b\\uda2c\\uda2d\\uda2e\\uda2f\\uda30\\uda31\\uda32\\uda33\\uda34\\uda35\\uda36\\uda37\\uda38\\uda39\\uda3a\\uda3b\\uda3c\\uda3d\\uda3e\\uda3f\\uda40\\uda41\\uda42\\uda43\\uda44\\uda45\\uda46\\uda47\\uda48\\uda49\\uda4a\\uda4b\\uda4c\\uda4d\\uda4e\\uda4f\\uda50\\uda51\\uda52\\uda53\\uda54\\uda55\\uda56\\uda57\\uda58\\uda59\\uda5a\\uda5b\\uda5c\\uda5d\\uda5e\\uda5f\\uda60\\uda61\\uda62\\uda63\\uda64\\uda65\\uda66\\uda67\\uda68\\uda69\\uda6a\\uda6b\\uda6c\\uda6d\\uda6e\\uda6f\\uda70\\uda71\\uda72\\uda73\\uda74\\uda75\\uda76\\uda77\\uda78\\uda79\\uda7a\\uda7b\\uda7c\\uda7d\\uda7e\\uda7f\\uda80\\uda81\\uda82\\uda83\\uda84\\uda85\\uda86\\uda87\\uda88\\uda89\\uda8a\\uda8b\\uda8c\\uda8d\\uda8e\\uda8f\\uda90\\uda91\\uda92\\uda93\\uda94\\uda95\\uda96\\uda97\\uda98\\uda99\\uda9a\\uda9b\\uda9c\\uda9d\\uda9e\\uda9f\\udaa0\\udaa1\\udaa2\\udaa3\\udaa4\\udaa5\\udaa6\\udaa7\\udaa8\\udaa9\\udaaa\\udaab\\udaac\\udaad\\udaae\\udaaf\\udab0\\udab1\\udab2\\udab3\\udab4\\udab5\\udab6\\udab7\\udab8\\udab9\\udaba\\udabb\\udabc\\udabd\\udabe\\udabf\\udac0\\udac1\\udac2\\udac3\\udac4\\udac5\\udac6\\udac7\\udac8\\udac9\\udaca\\udacb\\udacc\\udacd\\udace\\udacf\\udad0\\udad1\\udad2\\udad3\\udad4\\udad5\\udad6\\udad7\\udad8\\udad9\\udada\\udadb\\udadc\\udadd\\udade\\udadf\\udae0\\udae1\\udae2\\udae3\\udae4\\udae5\\udae6\\udae7\\udae8\\udae9\\udaea\\udaeb\\udaec\\udaed\\udaee\\udaef\\udaf0\\udaf1\\udaf2\\udaf3\\udaf4\\udaf5\\udaf6\\udaf7\\udaf8\\udaf9\\udafa\\udafb\\udafc\\udafd\\udafe\\udaff\\udb00\\udb01\\udb02\\udb03\\udb04\\udb05\\udb06\\udb07\\udb08\\udb09\\udb0a\\udb0b\\udb0c\\udb0d\\udb0e\\udb0f\\udb10\\udb11\\udb12\\udb13\\udb14\\udb15\\udb16\\udb17\\udb18\\udb19\\udb1a\\udb1b\\udb1c\\udb1d\\udb1e\\udb1f\\udb20\\udb21\\udb22\\udb23\\udb24\\udb25\\udb26\\udb27\\udb28\\udb29\\udb2a\\udb2b\\udb2c\\udb2d\\udb2e\\udb2f\\udb30\\udb31\\udb32\\udb33\\udb34\\udb35\\udb36\\udb37\\udb38\\udb39\\udb3a\\udb3b\\udb3c\\udb3d\\udb3e\\udb3f\\udb40\\udb41\\udb42\\udb43\\udb44\\udb45\\udb46\\udb47\\udb48\\udb49\\udb4a\\udb4b\\udb4c\\udb4d\\udb4e\\udb4f\\udb50\\udb51\\udb52\\udb53\\udb54\\udb55\\udb56\\udb57\\udb58\\udb59\\udb5a\\udb5b\\udb5c\\udb5d\\udb5e\\udb5f\\udb60\\udb61\\udb62\\udb63\\udb64\\udb65\\udb66\\udb67\\udb68\\udb69\\udb6a\\udb6b\\udb6c\\udb6d\\udb6e\\udb6f\\udb70\\udb71\\udb72\\udb73\\udb74\\udb75\\udb76\\udb77\\udb78\\udb79\\udb7a\\udb7b\\udb7c\\udb7d\\udb7e\\udb7f\\udb80\\udb81\\udb82\\udb83\\udb84\\udb85\\udb86\\udb87\\udb88\\udb89\\udb8a\\udb8b\\udb8c\\udb8d\\udb8e\\udb8f\\udb90\\udb91\\udb92\\udb93\\udb94\\udb95\\udb96\\udb97\\udb98\\udb99\\udb9a\\udb9b\\udb9c\\udb9d\\udb9e\\udb9f\\udba0\\udba1\\udba2\\udba3\\udba4\\udba5\\udba6\\udba7\\udba8\\udba9\\udbaa\\udbab\\udbac\\udbad\\udbae\\udbaf\\udbb0\\udbb1\\udbb2\\udbb3\\udbb4\\udbb5\\udbb6\\udbb7\\udbb8\\udbb9\\udbba\\udbbb\\udbbc\\udbbd\\udbbe\\udbbf\\udbc0\\udbc1\\udbc2\\udbc3\\udbc4\\udbc5\\udbc6\\udbc7\\udbc8\\udbc9\\udbca\\udbcb\\udbcc\\udbcd\\udbce\\udbcf\\udbd0\\udbd1\\udbd2\\udbd3\\udbd4\\udbd5\\udbd6\\udbd7\\udbd8\\udbd9\\udbda\\udbdb\\udbdc\\udbdd\\udbde\\udbdf\\udbe0\\udbe1\\udbe2\\udbe3\\udbe4\\udbe5\\udbe6\\udbe7\\udbe8\\udbe9\\udbea\\udbeb\\udbec\\udbed\\udbee\\udbef\\udbf0\\udbf1\\udbf2\\udbf3\\udbf4\\udbf5\\udbf6\\udbf7\\udbf8\\udbf9\\udbfa\\udbfb\\udbfc\\udbfd\\udbfe\\U0010fc00\\udc01\\udc02\\udc03\\udc04\\udc05\\udc06\\udc07\\udc08\\udc09\\udc0a\\udc0b\\udc0c\\udc0d\\udc0e\\udc0f\\udc10\\udc11\\udc12\\udc13\\udc14\\udc15\\udc16\\udc17\\udc18\\udc19\\udc1a\\udc1b\\udc1c\\udc1d\\udc1e\\udc1f\\udc20\\udc21\\udc22\\udc23\\udc24\\udc25\\udc26\\udc27\\udc28\\udc29\\udc2a\\udc2b\\udc2c\\udc2d\\udc2e\\udc2f\\udc30\\udc31\\udc32\\udc33\\udc34\\udc35\\udc36\\udc37\\udc38\\udc39\\udc3a\\udc3b\\udc3c\\udc3d\\udc3e\\udc3f\\udc40\\udc41\\udc42\\udc43\\udc44\\udc45\\udc46\\udc47\\udc48\\udc49\\udc4a\\udc4b\\udc4c\\udc4d\\udc4e\\udc4f\\udc50\\udc51\\udc52\\udc53\\udc54\\udc55\\udc56\\udc57\\udc58\\udc59\\udc5a\\udc5b\\udc5c\\udc5d\\udc5e\\udc5f\\udc60\\udc61\\udc62\\udc63\\udc64\\udc65\\udc66\\udc67\\udc68\\udc69\\udc6a\\udc6b\\udc6c\\udc6d\\udc6e\\udc6f\\udc70\\udc71\\udc72\\udc73\\udc74\\udc75\\udc76\\udc77\\udc78\\udc79\\udc7a\\udc7b\\udc7c\\udc7d\\udc7e\\udc7f\\udc80\\udc81\\udc82\\udc83\\udc84\\udc85\\udc86\\udc87\\udc88\\udc89\\udc8a\\udc8b\\udc8c\\udc8d\\udc8e\\udc8f\\udc90\\udc91\\udc92\\udc93\\udc94\\udc95\\udc96\\udc97\\udc98\\udc99\\udc9a\\udc9b\\udc9c\\udc9d\\udc9e\\udc9f\\udca0\\udca1\\udca2\\udca3\\udca4\\udca5\\udca6\\udca7\\udca8\\udca9\\udcaa\\udcab\\udcac\\udcad\\udcae\\udcaf\\udcb0\\udcb1\\udcb2\\udcb3\\udcb4\\udcb5\\udcb6\\udcb7\\udcb8\\udcb9\\udcba\\udcbb\\udcbc\\udcbd\\udcbe\\udcbf\\udcc0\\udcc1\\udcc2\\udcc3\\udcc4\\udcc5\\udcc6\\udcc7\\udcc8\\udcc9\\udcca\\udccb\\udccc\\udccd\\udcce\\udccf\\udcd0\\udcd1\\udcd2\\udcd3\\udcd4\\udcd5\\udcd6\\udcd7\\udcd8\\udcd9\\udcda\\udcdb\\udcdc\\udcdd\\udcde\\udcdf\\udce0\\udce1\\udce2\\udce3\\udce4\\udce5\\udce6\\udce7\\udce8\\udce9\\udcea\\udceb\\udcec\\udced\\udcee\\udcef\\udcf0\\udcf1\\udcf2\\udcf3\\udcf4\\udcf5\\udcf6\\udcf7\\udcf8\\udcf9\\udcfa\\udcfb\\udcfc\\udcfd\\udcfe\\udcff\\udd00\\udd01\\udd02\\udd03\\udd04\\udd05\\udd06\\udd07\\udd08\\udd09\\udd0a\\udd0b\\udd0c\\udd0d\\udd0e\\udd0f\\udd10\\udd11\\udd12\\udd13\\udd14\\udd15\\udd16\\udd17\\udd18\\udd19\\udd1a\\udd1b\\udd1c\\udd1d\\udd1e\\udd1f\\udd20\\udd21\\udd22\\udd23\\udd24\\udd25\\udd26\\udd27\\udd28\\udd29\\udd2a\\udd2b\\udd2c\\udd2d\\udd2e\\udd2f\\udd30\\udd31\\udd32\\udd33\\udd34\\udd35\\udd36\\udd37\\udd38\\udd39\\udd3a\\udd3b\\udd3c\\udd3d\\udd3e\\udd3f\\udd40\\udd41\\udd42\\udd43\\udd44\\udd45\\udd46\\udd47\\udd48\\udd49\\udd4a\\udd4b\\udd4c\\udd4d\\udd4e\\udd4f\\udd50\\udd51\\udd52\\udd53\\udd54\\udd55\\udd56\\udd57\\udd58\\udd59\\udd5a\\udd5b\\udd5c\\udd5d\\udd5e\\udd5f\\udd60\\udd61\\udd62\\udd63\\udd64\\udd65\\udd66\\udd67\\udd68\\udd69\\udd6a\\udd6b\\udd6c\\udd6d\\udd6e\\udd6f\\udd70\\udd71\\udd72\\udd73\\udd74\\udd75\\udd76\\udd77\\udd78\\udd79\\udd7a\\udd7b\\udd7c\\udd7d\\udd7e\\udd7f\\udd80\\udd81\\udd82\\udd83\\udd84\\udd85\\udd86\\udd87\\udd88\\udd89\\udd8a\\udd8b\\udd8c\\udd8d\\udd8e\\udd8f\\udd90\\udd91\\udd92\\udd93\\udd94\\udd95\\udd96\\udd97\\udd98\\udd99\\udd9a\\udd9b\\udd9c\\udd9d\\udd9e\\udd9f\\udda0\\udda1\\udda2\\udda3\\udda4\\udda5\\udda6\\udda7\\udda8\\udda9\\uddaa\\uddab\\uddac\\uddad\\uddae\\uddaf\\uddb0\\uddb1\\uddb2\\uddb3\\uddb4\\uddb5\\uddb6\\uddb7\\uddb8\\uddb9\\uddba\\uddbb\\uddbc\\uddbd\\uddbe\\uddbf\\uddc0\\uddc1\\uddc2\\uddc3\\uddc4\\uddc5\\uddc6\\uddc7\\uddc8\\uddc9\\uddca\\uddcb\\uddcc\\uddcd\\uddce\\uddcf\\uddd0\\uddd1\\uddd2\\uddd3\\uddd4\\uddd5\\uddd6\\uddd7\\uddd8\\uddd9\\uddda\\udddb\\udddc\\udddd\\uddde\\udddf\\udde0\\udde1\\udde2\\udde3\\udde4\\udde5\\udde6\\udde7\\udde8\\udde9\\uddea\\uddeb\\uddec\\udded\\uddee\\uddef\\uddf0\\uddf1\\uddf2\\uddf3\\uddf4\\uddf5\\uddf6\\uddf7\\uddf8\\uddf9\\uddfa\\uddfb\\uddfc\\uddfd\\uddfe\\uddff\\ude00\\ude01\\ude02\\ude03\\ude04\\ude05\\ude06\\ude07\\ude08\\ude09\\ude0a\\ude0b\\ude0c\\ude0d\\ude0e\\ude0f\\ude10\\ude11\\ude12\\ude13\\ude14\\ude15\\ude16\\ude17\\ude18\\ude19\\ude1a\\ude1b\\ude1c\\ude1d\\ude1e\\ude1f\\ude20\\ude21\\ude22\\ude23\\ude24\\ude25\\ude26\\ude27\\ude28\\ude29\\ude2a\\ude2b\\ude2c\\ude2d\\ude2e\\ude2f\\ude30\\ude31\\ude32\\ude33\\ude34\\ude35\\ude36\\ude37\\ude38\\ude39\\ude3a\\ude3b\\ude3c\\ude3d\\ude3e\\ude3f\\ude40\\ude41\\ude42\\ude43\\ude44\\ude45\\ude46\\ude47\\ude48\\ude49\\ude4a\\ude4b\\ude4c\\ude4d\\ude4e\\ude4f\\ude50\\ude51\\ude52\\ude53\\ude54\\ude55\\ude56\\ude57\\ude58\\ude59\\ude5a\\ude5b\\ude5c\\ude5d\\ude5e\\ude5f\\ude60\\ude61\\ude62\\ude63\\ude64\\ude65\\ude66\\ude67\\ude68\\ude69\\ude6a\\ude6b\\ude6c\\ude6d\\ude6e\\ude6f\\ude70\\ude71\\ude72\\ude73\\ude74\\ude75\\ude76\\ude77\\ude78\\ude79\\ude7a\\ude7b\\ude7c\\ude7d\\ude7e\\ude7f\\ude80\\ude81\\ude82\\ude83\\ude84\\ude85\\ude86\\ude87\\ude88\\ude89\\ude8a\\ude8b\\ude8c\\ude8d\\ude8e\\ude8f\\ude90\\ude91\\ude92\\ude93\\ude94\\ude95\\ude96\\ude97\\ude98\\ude99\\ude9a\\ude9b\\ude9c\\ude9d\\ude9e\\ude9f\\udea0\\udea1\\udea2\\udea3\\udea4\\udea5\\udea6\\udea7\\udea8\\udea9\\udeaa\\udeab\\udeac\\udead\\udeae\\udeaf\\udeb0\\udeb1\\udeb2\\udeb3\\udeb4\\udeb5\\udeb6\\udeb7\\udeb8\\udeb9\\udeba\\udebb\\udebc\\udebd\\udebe\\udebf\\udec0\\udec1\\udec2\\udec3\\udec4\\udec5\\udec6\\udec7\\udec8\\udec9\\udeca\\udecb\\udecc\\udecd\\udece\\udecf\\uded0\\uded1\\uded2\\uded3\\uded4\\uded5\\uded6\\uded7\\uded8\\uded9\\udeda\\udedb\\udedc\\udedd\\udede\\udedf\\udee0\\udee1\\udee2\\udee3\\udee4\\udee5\\udee6\\udee7\\udee8\\udee9\\udeea\\udeeb\\udeec\\udeed\\udeee\\udeef\\udef0\\udef1\\udef2\\udef3\\udef4\\udef5\\udef6\\udef7\\udef8\\udef9\\udefa\\udefb\\udefc\\udefd\\udefe\\udeff\\udf00\\udf01\\udf02\\udf03\\udf04\\udf05\\udf06\\udf07\\udf08\\udf09\\udf0a\\udf0b\\udf0c\\udf0d\\udf0e\\udf0f\\udf10\\udf11\\udf12\\udf13\\udf14\\udf15\\udf16\\udf17\\udf18\\udf19\\udf1a\\udf1b\\udf1c\\udf1d\\udf1e\\udf1f\\udf20\\udf21\\udf22\\udf23\\udf24\\udf25\\udf26\\udf27\\udf28\\udf29\\udf2a\\udf2b\\udf2c\\udf2d\\udf2e\\udf2f\\udf30\\udf31\\udf32\\udf33\\udf34\\udf35\\udf36\\udf37\\udf38\\udf39\\udf3a\\udf3b\\udf3c\\udf3d\\udf3e\\udf3f\\udf40\\udf41\\udf42\\udf43\\udf44\\udf45\\udf46\\udf47\\udf48\\udf49\\udf4a\\udf4b\\udf4c\\udf4d\\udf4e\\udf4f\\udf50\\udf51\\udf52\\udf53\\udf54\\udf55\\udf56\\udf57\\udf58\\udf59\\udf5a\\udf5b\\udf5c\\udf5d\\udf5e\\udf5f\\udf60\\udf61\\udf62\\udf63\\udf64\\udf65\\udf66\\udf67\\udf68\\udf69\\udf6a\\udf6b\\udf6c\\udf6d\\udf6e\\udf6f\\udf70\\udf71\\udf72\\udf73\\udf74\\udf75\\udf76\\udf77\\udf78\\udf79\\udf7a\\udf7b\\udf7c\\udf7d\\udf7e\\udf7f\\udf80\\udf81\\udf82\\udf83\\udf84\\udf85\\udf86\\udf87\\udf88\\udf89\\udf8a\\udf8b\\udf8c\\udf8d\\udf8e\\udf8f\\udf90\\udf91\\udf92\\udf93\\udf94\\udf95\\udf96\\udf97\\udf98\\udf99\\udf9a\\udf9b\\udf9c\\udf9d\\udf9e\\udf9f\\udfa0\\udfa1\\udfa2\\udfa3\\udfa4\\udfa5\\udfa6\\udfa7\\udfa8\\udfa9\\udfaa\\udfab\\udfac\\udfad\\udfae\\udfaf\\udfb0\\udfb1\\udfb2\\udfb3\\udfb4\\udfb5\\udfb6\\udfb7\\udfb8\\udfb9\\udfba\\udfbb\\udfbc\\udfbd\\udfbe\\udfbf\\udfc0\\udfc1\\udfc2\\udfc3\\udfc4\\udfc5\\udfc6\\udfc7\\udfc8\\udfc9\\udfca\\udfcb\\udfcc\\udfcd\\udfce\\udfcf\\udfd0\\udfd1\\udfd2\\udfd3\\udfd4\\udfd5\\udfd6\\udfd7\\udfd8\\udfd9\\udfda\\udfdb\\udfdc\\udfdd\\udfde\\udfdf\\udfe0\\udfe1\\udfe2\\udfe3\\udfe4\\udfe5\\udfe6\\udfe7\\udfe8\\udfe9\\udfea\\udfeb\\udfec\\udfed\\udfee\\udfef\\udff0\\udff1\\udff2\\udff3\\udff4\\udff5\\udff6\\udff7\\udff8\\udff9\\udffa\\udffb\\udffc\\udffd\\udffe\\udfff'\")\nexcept UnicodeDecodeError:\n    Cs = '' # Jython can't handle isolated surrogates\n\nLl = u'abcdefghijklmnopqrstuvwxyz\\xaa\\xb5\\xba\\xdf\\xe0\\xe1\\xe2\\xe3\\xe4\\xe5\\xe6\\xe7\\xe8\\xe9\\xea\\xeb\\xec\\xed\\xee\\xef\\xf0\\xf1\\xf2\\xf3\\xf4\\xf5\\xf6\\xf8\\xf9\\xfa\\xfb\\xfc\\xfd\\xfe\\xff\\u0101\\u0103\\u0105\\u0107\\u0109\\u010b\\u010d\\u010f\\u0111\\u0113\\u0115\\u0117\\u0119\\u011b\\u011d\\u011f\\u0121\\u0123\\u0125\\u0127\\u0129\\u012b\\u012d\\u012f\\u0131\\u0133\\u0135\\u0137\\u0138\\u013a\\u013c\\u013e\\u0140\\u0142\\u0144\\u0146\\u0148\\u0149\\u014b\\u014d\\u014f\\u0151\\u0153\\u0155\\u0157\\u0159\\u015b\\u015d\\u015f\\u0161\\u0163\\u0165\\u0167\\u0169\\u016b\\u016d\\u016f\\u0171\\u0173\\u0175\\u0177\\u017a\\u017c\\u017e\\u017f\\u0180\\u0183\\u0185\\u0188\\u018c\\u018d\\u0192\\u0195\\u0199\\u019a\\u019b\\u019e\\u01a1\\u01a3\\u01a5\\u01a8\\u01aa\\u01ab\\u01ad\\u01b0\\u01b4\\u01b6\\u01b9\\u01ba\\u01bd\\u01be\\u01bf\\u01c6\\u01c9\\u01cc\\u01ce\\u01d0\\u01d2\\u01d4\\u01d6\\u01d8\\u01da\\u01dc\\u01dd\\u01df\\u01e1\\u01e3\\u01e5\\u01e7\\u01e9\\u01eb\\u01ed\\u01ef\\u01f0\\u01f3\\u01f5\\u01f9\\u01fb\\u01fd\\u01ff\\u0201\\u0203\\u0205\\u0207\\u0209\\u020b\\u020d\\u020f\\u0211\\u0213\\u0215\\u0217\\u0219\\u021b\\u021d\\u021f\\u0221\\u0223\\u0225\\u0227\\u0229\\u022b\\u022d\\u022f\\u0231\\u0233\\u0234\\u0235\\u0236\\u0237\\u0238\\u0239\\u023c\\u023f\\u0240\\u0250\\u0251\\u0252\\u0253\\u0254\\u0255\\u0256\\u0257\\u0258\\u0259\\u025a\\u025b\\u025c\\u025d\\u025e\\u025f\\u0260\\u0261\\u0262\\u0263\\u0264\\u0265\\u0266\\u0267\\u0268\\u0269\\u026a\\u026b\\u026c\\u026d\\u026e\\u026f\\u0270\\u0271\\u0272\\u0273\\u0274\\u0275\\u0276\\u0277\\u0278\\u0279\\u027a\\u027b\\u027c\\u027d\\u027e\\u027f\\u0280\\u0281\\u0282\\u0283\\u0284\\u0285\\u0286\\u0287\\u0288\\u0289\\u028a\\u028b\\u028c\\u028d\\u028e\\u028f\\u0290\\u0291\\u0292\\u0293\\u0294\\u0295\\u0296\\u0297\\u0298\\u0299\\u029a\\u029b\\u029c\\u029d\\u029e\\u029f\\u02a0\\u02a1\\u02a2\\u02a3\\u02a4\\u02a5\\u02a6\\u02a7\\u02a8\\u02a9\\u02aa\\u02ab\\u02ac\\u02ad\\u02ae\\u02af\\u0390\\u03ac\\u03ad\\u03ae\\u03af\\u03b0\\u03b1\\u03b2\\u03b3\\u03b4\\u03b5\\u03b6\\u03b7\\u03b8\\u03b9\\u03ba\\u03bb\\u03bc\\u03bd\\u03be\\u03bf\\u03c0\\u03c1\\u03c2\\u03c3\\u03c4\\u03c5\\u03c6\\u03c7\\u03c8\\u03c9\\u03ca\\u03cb\\u03cc\\u03cd\\u03ce\\u03d0\\u03d1\\u03d5\\u03d6\\u03d7\\u03d9\\u03db\\u03dd\\u03df\\u03e1\\u03e3\\u03e5\\u03e7\\u03e9\\u03eb\\u03ed\\u03ef\\u03f0\\u03f1\\u03f2\\u03f3\\u03f5\\u03f8\\u03fb\\u03fc\\u0430\\u0431\\u0432\\u0433\\u0434\\u0435\\u0436\\u0437\\u0438\\u0439\\u043a\\u043b\\u043c\\u043d\\u043e\\u043f\\u0440\\u0441\\u0442\\u0443\\u0444\\u0445\\u0446\\u0447\\u0448\\u0449\\u044a\\u044b\\u044c\\u044d\\u044e\\u044f\\u0450\\u0451\\u0452\\u0453\\u0454\\u0455\\u0456\\u0457\\u0458\\u0459\\u045a\\u045b\\u045c\\u045d\\u045e\\u045f\\u0461\\u0463\\u0465\\u0467\\u0469\\u046b\\u046d\\u046f\\u0471\\u0473\\u0475\\u0477\\u0479\\u047b\\u047d\\u047f\\u0481\\u048b\\u048d\\u048f\\u0491\\u0493\\u0495\\u0497\\u0499\\u049b\\u049d\\u049f\\u04a1\\u04a3\\u04a5\\u04a7\\u04a9\\u04ab\\u04ad\\u04af\\u04b1\\u04b3\\u04b5\\u04b7\\u04b9\\u04bb\\u04bd\\u04bf\\u04c2\\u04c4\\u04c6\\u04c8\\u04ca\\u04cc\\u04ce\\u04d1\\u04d3\\u04d5\\u04d7\\u04d9\\u04db\\u04dd\\u04df\\u04e1\\u04e3\\u04e5\\u04e7\\u04e9\\u04eb\\u04ed\\u04ef\\u04f1\\u04f3\\u04f5\\u04f7\\u04f9\\u0501\\u0503\\u0505\\u0507\\u0509\\u050b\\u050d\\u050f\\u0561\\u0562\\u0563\\u0564\\u0565\\u0566\\u0567\\u0568\\u0569\\u056a\\u056b\\u056c\\u056d\\u056e\\u056f\\u0570\\u0571\\u0572\\u0573\\u0574\\u0575\\u0576\\u0577\\u0578\\u0579\\u057a\\u057b\\u057c\\u057d\\u057e\\u057f\\u0580\\u0581\\u0582\\u0583\\u0584\\u0585\\u0586\\u0587\\u1d00\\u1d01\\u1d02\\u1d03\\u1d04\\u1d05\\u1d06\\u1d07\\u1d08\\u1d09\\u1d0a\\u1d0b\\u1d0c\\u1d0d\\u1d0e\\u1d0f\\u1d10\\u1d11\\u1d12\\u1d13\\u1d14\\u1d15\\u1d16\\u1d17\\u1d18\\u1d19\\u1d1a\\u1d1b\\u1d1c\\u1d1d\\u1d1e\\u1d1f\\u1d20\\u1d21\\u1d22\\u1d23\\u1d24\\u1d25\\u1d26\\u1d27\\u1d28\\u1d29\\u1d2a\\u1d2b\\u1d62\\u1d63\\u1d64\\u1d65\\u1d66\\u1d67\\u1d68\\u1d69\\u1d6a\\u1d6b\\u1d6c\\u1d6d\\u1d6e\\u1d6f\\u1d70\\u1d71\\u1d72\\u1d73\\u1d74\\u1d75\\u1d76\\u1d77\\u1d79\\u1d7a\\u1d7b\\u1d7c\\u1d7d\\u1d7e\\u1d7f\\u1d80\\u1d81\\u1d82\\u1d83\\u1d84\\u1d85\\u1d86\\u1d87\\u1d88\\u1d89\\u1d8a\\u1d8b\\u1d8c\\u1d8d\\u1d8e\\u1d8f\\u1d90\\u1d91\\u1d92\\u1d93\\u1d94\\u1d95\\u1d96\\u1d97\\u1d98\\u1d99\\u1d9a\\u1e01\\u1e03\\u1e05\\u1e07\\u1e09\\u1e0b\\u1e0d\\u1e0f\\u1e11\\u1e13\\u1e15\\u1e17\\u1e19\\u1e1b\\u1e1d\\u1e1f\\u1e21\\u1e23\\u1e25\\u1e27\\u1e29\\u1e2b\\u1e2d\\u1e2f\\u1e31\\u1e33\\u1e35\\u1e37\\u1e39\\u1e3b\\u1e3d\\u1e3f\\u1e41\\u1e43\\u1e45\\u1e47\\u1e49\\u1e4b\\u1e4d\\u1e4f\\u1e51\\u1e53\\u1e55\\u1e57\\u1e59\\u1e5b\\u1e5d\\u1e5f\\u1e61\\u1e63\\u1e65\\u1e67\\u1e69\\u1e6b\\u1e6d\\u1e6f\\u1e71\\u1e73\\u1e75\\u1e77\\u1e79\\u1e7b\\u1e7d\\u1e7f\\u1e81\\u1e83\\u1e85\\u1e87\\u1e89\\u1e8b\\u1e8d\\u1e8f\\u1e91\\u1e93\\u1e95\\u1e96\\u1e97\\u1e98\\u1e99\\u1e9a\\u1e9b\\u1ea1\\u1ea3\\u1ea5\\u1ea7\\u1ea9\\u1eab\\u1ead\\u1eaf\\u1eb1\\u1eb3\\u1eb5\\u1eb7\\u1eb9\\u1ebb\\u1ebd\\u1ebf\\u1ec1\\u1ec3\\u1ec5\\u1ec7\\u1ec9\\u1ecb\\u1ecd\\u1ecf\\u1ed1\\u1ed3\\u1ed5\\u1ed7\\u1ed9\\u1edb\\u1edd\\u1edf\\u1ee1\\u1ee3\\u1ee5\\u1ee7\\u1ee9\\u1eeb\\u1eed\\u1eef\\u1ef1\\u1ef3\\u1ef5\\u1ef7\\u1ef9\\u1f00\\u1f01\\u1f02\\u1f03\\u1f04\\u1f05\\u1f06\\u1f07\\u1f10\\u1f11\\u1f12\\u1f13\\u1f14\\u1f15\\u1f20\\u1f21\\u1f22\\u1f23\\u1f24\\u1f25\\u1f26\\u1f27\\u1f30\\u1f31\\u1f32\\u1f33\\u1f34\\u1f35\\u1f36\\u1f37\\u1f40\\u1f41\\u1f42\\u1f43\\u1f44\\u1f45\\u1f50\\u1f51\\u1f52\\u1f53\\u1f54\\u1f55\\u1f56\\u1f57\\u1f60\\u1f61\\u1f62\\u1f63\\u1f64\\u1f65\\u1f66\\u1f67\\u1f70\\u1f71\\u1f72\\u1f73\\u1f74\\u1f75\\u1f76\\u1f77\\u1f78\\u1f79\\u1f7a\\u1f7b\\u1f7c\\u1f7d\\u1f80\\u1f81\\u1f82\\u1f83\\u1f84\\u1f85\\u1f86\\u1f87\\u1f90\\u1f91\\u1f92\\u1f93\\u1f94\\u1f95\\u1f96\\u1f97\\u1fa0\\u1fa1\\u1fa2\\u1fa3\\u1fa4\\u1fa5\\u1fa6\\u1fa7\\u1fb0\\u1fb1\\u1fb2\\u1fb3\\u1fb4\\u1fb6\\u1fb7\\u1fbe\\u1fc2\\u1fc3\\u1fc4\\u1fc6\\u1fc7\\u1fd0\\u1fd1\\u1fd2\\u1fd3\\u1fd6\\u1fd7\\u1fe0\\u1fe1\\u1fe2\\u1fe3\\u1fe4\\u1fe5\\u1fe6\\u1fe7\\u1ff2\\u1ff3\\u1ff4\\u1ff6\\u1ff7\\u2071\\u207f\\u210a\\u210e\\u210f\\u2113\\u212f\\u2134\\u2139\\u213c\\u213d\\u2146\\u2147\\u2148\\u2149\\u2c30\\u2c31\\u2c32\\u2c33\\u2c34\\u2c35\\u2c36\\u2c37\\u2c38\\u2c39\\u2c3a\\u2c3b\\u2c3c\\u2c3d\\u2c3e\\u2c3f\\u2c40\\u2c41\\u2c42\\u2c43\\u2c44\\u2c45\\u2c46\\u2c47\\u2c48\\u2c49\\u2c4a\\u2c4b\\u2c4c\\u2c4d\\u2c4e\\u2c4f\\u2c50\\u2c51\\u2c52\\u2c53\\u2c54\\u2c55\\u2c56\\u2c57\\u2c58\\u2c59\\u2c5a\\u2c5b\\u2c5c\\u2c5d\\u2c5e\\u2c81\\u2c83\\u2c85\\u2c87\\u2c89\\u2c8b\\u2c8d\\u2c8f\\u2c91\\u2c93\\u2c95\\u2c97\\u2c99\\u2c9b\\u2c9d\\u2c9f\\u2ca1\\u2ca3\\u2ca5\\u2ca7\\u2ca9\\u2cab\\u2cad\\u2caf\\u2cb1\\u2cb3\\u2cb5\\u2cb7\\u2cb9\\u2cbb\\u2cbd\\u2cbf\\u2cc1\\u2cc3\\u2cc5\\u2cc7\\u2cc9\\u2ccb\\u2ccd\\u2ccf\\u2cd1\\u2cd3\\u2cd5\\u2cd7\\u2cd9\\u2cdb\\u2cdd\\u2cdf\\u2ce1\\u2ce3\\u2ce4\\u2d00\\u2d01\\u2d02\\u2d03\\u2d04\\u2d05\\u2d06\\u2d07\\u2d08\\u2d09\\u2d0a\\u2d0b\\u2d0c\\u2d0d\\u2d0e\\u2d0f\\u2d10\\u2d11\\u2d12\\u2d13\\u2d14\\u2d15\\u2d16\\u2d17\\u2d18\\u2d19\\u2d1a\\u2d1b\\u2d1c\\u2d1d\\u2d1e\\u2d1f\\u2d20\\u2d21\\u2d22\\u2d23\\u2d24\\u2d25\\ufb00\\ufb01\\ufb02\\ufb03\\ufb04\\ufb05\\ufb06\\ufb13\\ufb14\\ufb15\\ufb16\\ufb17\\uff41\\uff42\\uff43\\uff44\\uff45\\uff46\\uff47\\uff48\\uff49\\uff4a\\uff4b\\uff4c\\uff4d\\uff4e\\uff4f\\uff50\\uff51\\uff52\\uff53\\uff54\\uff55\\uff56\\uff57\\uff58\\uff59\\uff5a'\n\nLm = u'\\u02b0\\u02b1\\u02b2\\u02b3\\u02b4\\u02b5\\u02b6\\u02b7\\u02b8\\u02b9\\u02ba\\u02bb\\u02bc\\u02bd\\u02be\\u02bf\\u02c0\\u02c1\\u02c6\\u02c7\\u02c8\\u02c9\\u02ca\\u02cb\\u02cc\\u02cd\\u02ce\\u02cf\\u02d0\\u02d1\\u02e0\\u02e1\\u02e2\\u02e3\\u02e4\\u02ee\\u037a\\u0559\\u0640\\u06e5\\u06e6\\u0e46\\u0ec6\\u10fc\\u17d7\\u1843\\u1d2c\\u1d2d\\u1d2e\\u1d2f\\u1d30\\u1d31\\u1d32\\u1d33\\u1d34\\u1d35\\u1d36\\u1d37\\u1d38\\u1d39\\u1d3a\\u1d3b\\u1d3c\\u1d3d\\u1d3e\\u1d3f\\u1d40\\u1d41\\u1d42\\u1d43\\u1d44\\u1d45\\u1d46\\u1d47\\u1d48\\u1d49\\u1d4a\\u1d4b\\u1d4c\\u1d4d\\u1d4e\\u1d4f\\u1d50\\u1d51\\u1d52\\u1d53\\u1d54\\u1d55\\u1d56\\u1d57\\u1d58\\u1d59\\u1d5a\\u1d5b\\u1d5c\\u1d5d\\u1d5e\\u1d5f\\u1d60\\u1d61\\u1d78\\u1d9b\\u1d9c\\u1d9d\\u1d9e\\u1d9f\\u1da0\\u1da1\\u1da2\\u1da3\\u1da4\\u1da5\\u1da6\\u1da7\\u1da8\\u1da9\\u1daa\\u1dab\\u1dac\\u1dad\\u1dae\\u1daf\\u1db0\\u1db1\\u1db2\\u1db3\\u1db4\\u1db5\\u1db6\\u1db7\\u1db8\\u1db9\\u1dba\\u1dbb\\u1dbc\\u1dbd\\u1dbe\\u1dbf\\u2090\\u2091\\u2092\\u2093\\u2094\\u2d6f\\u3005\\u3031\\u3032\\u3033\\u3034\\u3035\\u303b\\u309d\\u309e\\u30fc\\u30fd\\u30fe\\ua015\\uff70\\uff9e\\uff9f'\n\nLo = u'\\u01bb\\u01c0\\u01c1\\u01c2\\u01c3\\u05d0\\u05d1\\u05d2\\u05d3\\u05d4\\u05d5\\u05d6\\u05d7\\u05d8\\u05d9\\u05da\\u05db\\u05dc\\u05dd\\u05de\\u05df\\u05e0\\u05e1\\u05e2\\u05e3\\u05e4\\u05e5\\u05e6\\u05e7\\u05e8\\u05e9\\u05ea\\u05f0\\u05f1\\u05f2\\u0621\\u0622\\u0623\\u0624\\u0625\\u0626\\u0627\\u0628\\u0629\\u062a\\u062b\\u062c\\u062d\\u062e\\u062f\\u0630\\u0631\\u0632\\u0633\\u0634\\u0635\\u0636\\u0637\\u0638\\u0639\\u063a\\u0641\\u0642\\u0643\\u0644\\u0645\\u0646\\u0647\\u0648\\u0649\\u064a\\u066e\\u066f\\u0671\\u0672\\u0673\\u0674\\u0675\\u0676\\u0677\\u0678\\u0679\\u067a\\u067b\\u067c\\u067d\\u067e\\u067f\\u0680\\u0681\\u0682\\u0683\\u0684\\u0685\\u0686\\u0687\\u0688\\u0689\\u068a\\u068b\\u068c\\u068d\\u068e\\u068f\\u0690\\u0691\\u0692\\u0693\\u0694\\u0695\\u0696\\u0697\\u0698\\u0699\\u069a\\u069b\\u069c\\u069d\\u069e\\u069f\\u06a0\\u06a1\\u06a2\\u06a3\\u06a4\\u06a5\\u06a6\\u06a7\\u06a8\\u06a9\\u06aa\\u06ab\\u06ac\\u06ad\\u06ae\\u06af\\u06b0\\u06b1\\u06b2\\u06b3\\u06b4\\u06b5\\u06b6\\u06b7\\u06b8\\u06b9\\u06ba\\u06bb\\u06bc\\u06bd\\u06be\\u06bf\\u06c0\\u06c1\\u06c2\\u06c3\\u06c4\\u06c5\\u06c6\\u06c7\\u06c8\\u06c9\\u06ca\\u06cb\\u06cc\\u06cd\\u06ce\\u06cf\\u06d0\\u06d1\\u06d2\\u06d3\\u06d5\\u06ee\\u06ef\\u06fa\\u06fb\\u06fc\\u06ff\\u0710\\u0712\\u0713\\u0714\\u0715\\u0716\\u0717\\u0718\\u0719\\u071a\\u071b\\u071c\\u071d\\u071e\\u071f\\u0720\\u0721\\u0722\\u0723\\u0724\\u0725\\u0726\\u0727\\u0728\\u0729\\u072a\\u072b\\u072c\\u072d\\u072e\\u072f\\u074d\\u074e\\u074f\\u0750\\u0751\\u0752\\u0753\\u0754\\u0755\\u0756\\u0757\\u0758\\u0759\\u075a\\u075b\\u075c\\u075d\\u075e\\u075f\\u0760\\u0761\\u0762\\u0763\\u0764\\u0765\\u0766\\u0767\\u0768\\u0769\\u076a\\u076b\\u076c\\u076d\\u0780\\u0781\\u0782\\u0783\\u0784\\u0785\\u0786\\u0787\\u0788\\u0789\\u078a\\u078b\\u078c\\u078d\\u078e\\u078f\\u0790\\u0791\\u0792\\u0793\\u0794\\u0795\\u0796\\u0797\\u0798\\u0799\\u079a\\u079b\\u079c\\u079d\\u079e\\u079f\\u07a0\\u07a1\\u07a2\\u07a3\\u07a4\\u07a5\\u07b1\\u0904\\u0905\\u0906\\u0907\\u0908\\u0909\\u090a\\u090b\\u090c\\u090d\\u090e\\u090f\\u0910\\u0911\\u0912\\u0913\\u0914\\u0915\\u0916\\u0917\\u0918\\u0919\\u091a\\u091b\\u091c\\u091d\\u091e\\u091f\\u0920\\u0921\\u0922\\u0923\\u0924\\u0925\\u0926\\u0927\\u0928\\u0929\\u092a\\u092b\\u092c\\u092d\\u092e\\u092f\\u0930\\u0931\\u0932\\u0933\\u0934\\u0935\\u0936\\u0937\\u0938\\u0939\\u093d\\u0950\\u0958\\u0959\\u095a\\u095b\\u095c\\u095d\\u095e\\u095f\\u0960\\u0961\\u097d\\u0985\\u0986\\u0987\\u0988\\u0989\\u098a\\u098b\\u098c\\u098f\\u0990\\u0993\\u0994\\u0995\\u0996\\u0997\\u0998\\u0999\\u099a\\u099b\\u099c\\u099d\\u099e\\u099f\\u09a0\\u09a1\\u09a2\\u09a3\\u09a4\\u09a5\\u09a6\\u09a7\\u09a8\\u09aa\\u09ab\\u09ac\\u09ad\\u09ae\\u09af\\u09b0\\u09b2\\u09b6\\u09b7\\u09b8\\u09b9\\u09bd\\u09ce\\u09dc\\u09dd\\u09df\\u09e0\\u09e1\\u09f0\\u09f1\\u0a05\\u0a06\\u0a07\\u0a08\\u0a09\\u0a0a\\u0a0f\\u0a10\\u0a13\\u0a14\\u0a15\\u0a16\\u0a17\\u0a18\\u0a19\\u0a1a\\u0a1b\\u0a1c\\u0a1d\\u0a1e\\u0a1f\\u0a20\\u0a21\\u0a22\\u0a23\\u0a24\\u0a25\\u0a26\\u0a27\\u0a28\\u0a2a\\u0a2b\\u0a2c\\u0a2d\\u0a2e\\u0a2f\\u0a30\\u0a32\\u0a33\\u0a35\\u0a36\\u0a38\\u0a39\\u0a59\\u0a5a\\u0a5b\\u0a5c\\u0a5e\\u0a72\\u0a73\\u0a74\\u0a85\\u0a86\\u0a87\\u0a88\\u0a89\\u0a8a\\u0a8b\\u0a8c\\u0a8d\\u0a8f\\u0a90\\u0a91\\u0a93\\u0a94\\u0a95\\u0a96\\u0a97\\u0a98\\u0a99\\u0a9a\\u0a9b\\u0a9c\\u0a9d\\u0a9e\\u0a9f\\u0aa0\\u0aa1\\u0aa2\\u0aa3\\u0aa4\\u0aa5\\u0aa6\\u0aa7\\u0aa8\\u0aaa\\u0aab\\u0aac\\u0aad\\u0aae\\u0aaf\\u0ab0\\u0ab2\\u0ab3\\u0ab5\\u0ab6\\u0ab7\\u0ab8\\u0ab9\\u0abd\\u0ad0\\u0ae0\\u0ae1\\u0b05\\u0b06\\u0b07\\u0b08\\u0b09\\u0b0a\\u0b0b\\u0b0c\\u0b0f\\u0b10\\u0b13\\u0b14\\u0b15\\u0b16\\u0b17\\u0b18\\u0b19\\u0b1a\\u0b1b\\u0b1c\\u0b1d\\u0b1e\\u0b1f\\u0b20\\u0b21\\u0b22\\u0b23\\u0b24\\u0b25\\u0b26\\u0b27\\u0b28\\u0b2a\\u0b2b\\u0b2c\\u0b2d\\u0b2e\\u0b2f\\u0b30\\u0b32\\u0b33\\u0b35\\u0b36\\u0b37\\u0b38\\u0b39\\u0b3d\\u0b5c\\u0b5d\\u0b5f\\u0b60\\u0b61\\u0b71\\u0b83\\u0b85\\u0b86\\u0b87\\u0b88\\u0b89\\u0b8a\\u0b8e\\u0b8f\\u0b90\\u0b92\\u0b93\\u0b94\\u0b95\\u0b99\\u0b9a\\u0b9c\\u0b9e\\u0b9f\\u0ba3\\u0ba4\\u0ba8\\u0ba9\\u0baa\\u0bae\\u0baf\\u0bb0\\u0bb1\\u0bb2\\u0bb3\\u0bb4\\u0bb5\\u0bb6\\u0bb7\\u0bb8\\u0bb9\\u0c05\\u0c06\\u0c07\\u0c08\\u0c09\\u0c0a\\u0c0b\\u0c0c\\u0c0e\\u0c0f\\u0c10\\u0c12\\u0c13\\u0c14\\u0c15\\u0c16\\u0c17\\u0c18\\u0c19\\u0c1a\\u0c1b\\u0c1c\\u0c1d\\u0c1e\\u0c1f\\u0c20\\u0c21\\u0c22\\u0c23\\u0c24\\u0c25\\u0c26\\u0c27\\u0c28\\u0c2a\\u0c2b\\u0c2c\\u0c2d\\u0c2e\\u0c2f\\u0c30\\u0c31\\u0c32\\u0c33\\u0c35\\u0c36\\u0c37\\u0c38\\u0c39\\u0c60\\u0c61\\u0c85\\u0c86\\u0c87\\u0c88\\u0c89\\u0c8a\\u0c8b\\u0c8c\\u0c8e\\u0c8f\\u0c90\\u0c92\\u0c93\\u0c94\\u0c95\\u0c96\\u0c97\\u0c98\\u0c99\\u0c9a\\u0c9b\\u0c9c\\u0c9d\\u0c9e\\u0c9f\\u0ca0\\u0ca1\\u0ca2\\u0ca3\\u0ca4\\u0ca5\\u0ca6\\u0ca7\\u0ca8\\u0caa\\u0cab\\u0cac\\u0cad\\u0cae\\u0caf\\u0cb0\\u0cb1\\u0cb2\\u0cb3\\u0cb5\\u0cb6\\u0cb7\\u0cb8\\u0cb9\\u0cbd\\u0cde\\u0ce0\\u0ce1\\u0d05\\u0d06\\u0d07\\u0d08\\u0d09\\u0d0a\\u0d0b\\u0d0c\\u0d0e\\u0d0f\\u0d10\\u0d12\\u0d13\\u0d14\\u0d15\\u0d16\\u0d17\\u0d18\\u0d19\\u0d1a\\u0d1b\\u0d1c\\u0d1d\\u0d1e\\u0d1f\\u0d20\\u0d21\\u0d22\\u0d23\\u0d24\\u0d25\\u0d26\\u0d27\\u0d28\\u0d2a\\u0d2b\\u0d2c\\u0d2d\\u0d2e\\u0d2f\\u0d30\\u0d31\\u0d32\\u0d33\\u0d34\\u0d35\\u0d36\\u0d37\\u0d38\\u0d39\\u0d60\\u0d61\\u0d85\\u0d86\\u0d87\\u0d88\\u0d89\\u0d8a\\u0d8b\\u0d8c\\u0d8d\\u0d8e\\u0d8f\\u0d90\\u0d91\\u0d92\\u0d93\\u0d94\\u0d95\\u0d96\\u0d9a\\u0d9b\\u0d9c\\u0d9d\\u0d9e\\u0d9f\\u0da0\\u0da1\\u0da2\\u0da3\\u0da4\\u0da5\\u0da6\\u0da7\\u0da8\\u0da9\\u0daa\\u0dab\\u0dac\\u0dad\\u0dae\\u0daf\\u0db0\\u0db1\\u0db3\\u0db4\\u0db5\\u0db6\\u0db7\\u0db8\\u0db9\\u0dba\\u0dbb\\u0dbd\\u0dc0\\u0dc1\\u0dc2\\u0dc3\\u0dc4\\u0dc5\\u0dc6\\u0e01\\u0e02\\u0e03\\u0e04\\u0e05\\u0e06\\u0e07\\u0e08\\u0e09\\u0e0a\\u0e0b\\u0e0c\\u0e0d\\u0e0e\\u0e0f\\u0e10\\u0e11\\u0e12\\u0e13\\u0e14\\u0e15\\u0e16\\u0e17\\u0e18\\u0e19\\u0e1a\\u0e1b\\u0e1c\\u0e1d\\u0e1e\\u0e1f\\u0e20\\u0e21\\u0e22\\u0e23\\u0e24\\u0e25\\u0e26\\u0e27\\u0e28\\u0e29\\u0e2a\\u0e2b\\u0e2c\\u0e2d\\u0e2e\\u0e2f\\u0e30\\u0e32\\u0e33\\u0e40\\u0e41\\u0e42\\u0e43\\u0e44\\u0e45\\u0e81\\u0e82\\u0e84\\u0e87\\u0e88\\u0e8a\\u0e8d\\u0e94\\u0e95\\u0e96\\u0e97\\u0e99\\u0e9a\\u0e9b\\u0e9c\\u0e9d\\u0e9e\\u0e9f\\u0ea1\\u0ea2\\u0ea3\\u0ea5\\u0ea7\\u0eaa\\u0eab\\u0ead\\u0eae\\u0eaf\\u0eb0\\u0eb2\\u0eb3\\u0ebd\\u0ec0\\u0ec1\\u0ec2\\u0ec3\\u0ec4\\u0edc\\u0edd\\u0f00\\u0f40\\u0f41\\u0f42\\u0f43\\u0f44\\u0f45\\u0f46\\u0f47\\u0f49\\u0f4a\\u0f4b\\u0f4c\\u0f4d\\u0f4e\\u0f4f\\u0f50\\u0f51\\u0f52\\u0f53\\u0f54\\u0f55\\u0f56\\u0f57\\u0f58\\u0f59\\u0f5a\\u0f5b\\u0f5c\\u0f5d\\u0f5e\\u0f5f\\u0f60\\u0f61\\u0f62\\u0f63\\u0f64\\u0f65\\u0f66\\u0f67\\u0f68\\u0f69\\u0f6a\\u0f88\\u0f89\\u0f8a\\u0f8b\\u1000\\u1001\\u1002\\u1003\\u1004\\u1005\\u1006\\u1007\\u1008\\u1009\\u100a\\u100b\\u100c\\u100d\\u100e\\u100f\\u1010\\u1011\\u1012\\u1013\\u1014\\u1015\\u1016\\u1017\\u1018\\u1019\\u101a\\u101b\\u101c\\u101d\\u101e\\u101f\\u1020\\u1021\\u1023\\u1024\\u1025\\u1026\\u1027\\u1029\\u102a\\u1050\\u1051\\u1052\\u1053\\u1054\\u1055\\u10d0\\u10d1\\u10d2\\u10d3\\u10d4\\u10d5\\u10d6\\u10d7\\u10d8\\u10d9\\u10da\\u10db\\u10dc\\u10dd\\u10de\\u10df\\u10e0\\u10e1\\u10e2\\u10e3\\u10e4\\u10e5\\u10e6\\u10e7\\u10e8\\u10e9\\u10ea\\u10eb\\u10ec\\u10ed\\u10ee\\u10ef\\u10f0\\u10f1\\u10f2\\u10f3\\u10f4\\u10f5\\u10f6\\u10f7\\u10f8\\u10f9\\u10fa\\u1100\\u1101\\u1102\\u1103\\u1104\\u1105\\u1106\\u1107\\u1108\\u1109\\u110a\\u110b\\u110c\\u110d\\u110e\\u110f\\u1110\\u1111\\u1112\\u1113\\u1114\\u1115\\u1116\\u1117\\u1118\\u1119\\u111a\\u111b\\u111c\\u111d\\u111e\\u111f\\u1120\\u1121\\u1122\\u1123\\u1124\\u1125\\u1126\\u1127\\u1128\\u1129\\u112a\\u112b\\u112c\\u112d\\u112e\\u112f\\u1130\\u1131\\u1132\\u1133\\u1134\\u1135\\u1136\\u1137\\u1138\\u1139\\u113a\\u113b\\u113c\\u113d\\u113e\\u113f\\u1140\\u1141\\u1142\\u1143\\u1144\\u1145\\u1146\\u1147\\u1148\\u1149\\u114a\\u114b\\u114c\\u114d\\u114e\\u114f\\u1150\\u1151\\u1152\\u1153\\u1154\\u1155\\u1156\\u1157\\u1158\\u1159\\u115f\\u1160\\u1161\\u1162\\u1163\\u1164\\u1165\\u1166\\u1167\\u1168\\u1169\\u116a\\u116b\\u116c\\u116d\\u116e\\u116f\\u1170\\u1171\\u1172\\u1173\\u1174\\u1175\\u1176\\u1177\\u1178\\u1179\\u117a\\u117b\\u117c\\u117d\\u117e\\u117f\\u1180\\u1181\\u1182\\u1183\\u1184\\u1185\\u1186\\u1187\\u1188\\u1189\\u118a\\u118b\\u118c\\u118d\\u118e\\u118f\\u1190\\u1191\\u1192\\u1193\\u1194\\u1195\\u1196\\u1197\\u1198\\u1199\\u119a\\u119b\\u119c\\u119d\\u119e\\u119f\\u11a0\\u11a1\\u11a2\\u11a8\\u11a9\\u11aa\\u11ab\\u11ac\\u11ad\\u11ae\\u11af\\u11b0\\u11b1\\u11b2\\u11b3\\u11b4\\u11b5\\u11b6\\u11b7\\u11b8\\u11b9\\u11ba\\u11bb\\u11bc\\u11bd\\u11be\\u11bf\\u11c0\\u11c1\\u11c2\\u11c3\\u11c4\\u11c5\\u11c6\\u11c7\\u11c8\\u11c9\\u11ca\\u11cb\\u11cc\\u11cd\\u11ce\\u11cf\\u11d0\\u11d1\\u11d2\\u11d3\\u11d4\\u11d5\\u11d6\\u11d7\\u11d8\\u11d9\\u11da\\u11db\\u11dc\\u11dd\\u11de\\u11df\\u11e0\\u11e1\\u11e2\\u11e3\\u11e4\\u11e5\\u11e6\\u11e7\\u11e8\\u11e9\\u11ea\\u11eb\\u11ec\\u11ed\\u11ee\\u11ef\\u11f0\\u11f1\\u11f2\\u11f3\\u11f4\\u11f5\\u11f6\\u11f7\\u11f8\\u11f9\\u1200\\u1201\\u1202\\u1203\\u1204\\u1205\\u1206\\u1207\\u1208\\u1209\\u120a\\u120b\\u120c\\u120d\\u120e\\u120f\\u1210\\u1211\\u1212\\u1213\\u1214\\u1215\\u1216\\u1217\\u1218\\u1219\\u121a\\u121b\\u121c\\u121d\\u121e\\u121f\\u1220\\u1221\\u1222\\u1223\\u1224\\u1225\\u1226\\u1227\\u1228\\u1229\\u122a\\u122b\\u122c\\u122d\\u122e\\u122f\\u1230\\u1231\\u1232\\u1233\\u1234\\u1235\\u1236\\u1237\\u1238\\u1239\\u123a\\u123b\\u123c\\u123d\\u123e\\u123f\\u1240\\u1241\\u1242\\u1243\\u1244\\u1245\\u1246\\u1247\\u1248\\u124a\\u124b\\u124c\\u124d\\u1250\\u1251\\u1252\\u1253\\u1254\\u1255\\u1256\\u1258\\u125a\\u125b\\u125c\\u125d\\u1260\\u1261\\u1262\\u1263\\u1264\\u1265\\u1266\\u1267\\u1268\\u1269\\u126a\\u126b\\u126c\\u126d\\u126e\\u126f\\u1270\\u1271\\u1272\\u1273\\u1274\\u1275\\u1276\\u1277\\u1278\\u1279\\u127a\\u127b\\u127c\\u127d\\u127e\\u127f\\u1280\\u1281\\u1282\\u1283\\u1284\\u1285\\u1286\\u1287\\u1288\\u128a\\u128b\\u128c\\u128d\\u1290\\u1291\\u1292\\u1293\\u1294\\u1295\\u1296\\u1297\\u1298\\u1299\\u129a\\u129b\\u129c\\u129d\\u129e\\u129f\\u12a0\\u12a1\\u12a2\\u12a3\\u12a4\\u12a5\\u12a6\\u12a7\\u12a8\\u12a9\\u12aa\\u12ab\\u12ac\\u12ad\\u12ae\\u12af\\u12b0\\u12b2\\u12b3\\u12b4\\u12b5\\u12b8\\u12b9\\u12ba\\u12bb\\u12bc\\u12bd\\u12be\\u12c0\\u12c2\\u12c3\\u12c4\\u12c5\\u12c8\\u12c9\\u12ca\\u12cb\\u12cc\\u12cd\\u12ce\\u12cf\\u12d0\\u12d1\\u12d2\\u12d3\\u12d4\\u12d5\\u12d6\\u12d8\\u12d9\\u12da\\u12db\\u12dc\\u12dd\\u12de\\u12df\\u12e0\\u12e1\\u12e2\\u12e3\\u12e4\\u12e5\\u12e6\\u12e7\\u12e8\\u12e9\\u12ea\\u12eb\\u12ec\\u12ed\\u12ee\\u12ef\\u12f0\\u12f1\\u12f2\\u12f3\\u12f4\\u12f5\\u12f6\\u12f7\\u12f8\\u12f9\\u12fa\\u12fb\\u12fc\\u12fd\\u12fe\\u12ff\\u1300\\u1301\\u1302\\u1303\\u1304\\u1305\\u1306\\u1307\\u1308\\u1309\\u130a\\u130b\\u130c\\u130d\\u130e\\u130f\\u1310\\u1312\\u1313\\u1314\\u1315\\u1318\\u1319\\u131a\\u131b\\u131c\\u131d\\u131e\\u131f\\u1320\\u1321\\u1322\\u1323\\u1324\\u1325\\u1326\\u1327\\u1328\\u1329\\u132a\\u132b\\u132c\\u132d\\u132e\\u132f\\u1330\\u1331\\u1332\\u1333\\u1334\\u1335\\u1336\\u1337\\u1338\\u1339\\u133a\\u133b\\u133c\\u133d\\u133e\\u133f\\u1340\\u1341\\u1342\\u1343\\u1344\\u1345\\u1346\\u1347\\u1348\\u1349\\u134a\\u134b\\u134c\\u134d\\u134e\\u134f\\u1350\\u1351\\u1352\\u1353\\u1354\\u1355\\u1356\\u1357\\u1358\\u1359\\u135a\\u1380\\u1381\\u1382\\u1383\\u1384\\u1385\\u1386\\u1387\\u1388\\u1389\\u138a\\u138b\\u138c\\u138d\\u138e\\u138f\\u13a0\\u13a1\\u13a2\\u13a3\\u13a4\\u13a5\\u13a6\\u13a7\\u13a8\\u13a9\\u13aa\\u13ab\\u13ac\\u13ad\\u13ae\\u13af\\u13b0\\u13b1\\u13b2\\u13b3\\u13b4\\u13b5\\u13b6\\u13b7\\u13b8\\u13b9\\u13ba\\u13bb\\u13bc\\u13bd\\u13be\\u13bf\\u13c0\\u13c1\\u13c2\\u13c3\\u13c4\\u13c5\\u13c6\\u13c7\\u13c8\\u13c9\\u13ca\\u13cb\\u13cc\\u13cd\\u13ce\\u13cf\\u13d0\\u13d1\\u13d2\\u13d3\\u13d4\\u13d5\\u13d6\\u13d7\\u13d8\\u13d9\\u13da\\u13db\\u13dc\\u13dd\\u13de\\u13df\\u13e0\\u13e1\\u13e2\\u13e3\\u13e4\\u13e5\\u13e6\\u13e7\\u13e8\\u13e9\\u13ea\\u13eb\\u13ec\\u13ed\\u13ee\\u13ef\\u13f0\\u13f1\\u13f2\\u13f3\\u13f4\\u1401\\u1402\\u1403\\u1404\\u1405\\u1406\\u1407\\u1408\\u1409\\u140a\\u140b\\u140c\\u140d\\u140e\\u140f\\u1410\\u1411\\u1412\\u1413\\u1414\\u1415\\u1416\\u1417\\u1418\\u1419\\u141a\\u141b\\u141c\\u141d\\u141e\\u141f\\u1420\\u1421\\u1422\\u1423\\u1424\\u1425\\u1426\\u1427\\u1428\\u1429\\u142a\\u142b\\u142c\\u142d\\u142e\\u142f\\u1430\\u1431\\u1432\\u1433\\u1434\\u1435\\u1436\\u1437\\u1438\\u1439\\u143a\\u143b\\u143c\\u143d\\u143e\\u143f\\u1440\\u1441\\u1442\\u1443\\u1444\\u1445\\u1446\\u1447\\u1448\\u1449\\u144a\\u144b\\u144c\\u144d\\u144e\\u144f\\u1450\\u1451\\u1452\\u1453\\u1454\\u1455\\u1456\\u1457\\u1458\\u1459\\u145a\\u145b\\u145c\\u145d\\u145e\\u145f\\u1460\\u1461\\u1462\\u1463\\u1464\\u1465\\u1466\\u1467\\u1468\\u1469\\u146a\\u146b\\u146c\\u146d\\u146e\\u146f\\u1470\\u1471\\u1472\\u1473\\u1474\\u1475\\u1476\\u1477\\u1478\\u1479\\u147a\\u147b\\u147c\\u147d\\u147e\\u147f\\u1480\\u1481\\u1482\\u1483\\u1484\\u1485\\u1486\\u1487\\u1488\\u1489\\u148a\\u148b\\u148c\\u148d\\u148e\\u148f\\u1490\\u1491\\u1492\\u1493\\u1494\\u1495\\u1496\\u1497\\u1498\\u1499\\u149a\\u149b\\u149c\\u149d\\u149e\\u149f\\u14a0\\u14a1\\u14a2\\u14a3\\u14a4\\u14a5\\u14a6\\u14a7\\u14a8\\u14a9\\u14aa\\u14ab\\u14ac\\u14ad\\u14ae\\u14af\\u14b0\\u14b1\\u14b2\\u14b3\\u14b4\\u14b5\\u14b6\\u14b7\\u14b8\\u14b9\\u14ba\\u14bb\\u14bc\\u14bd\\u14be\\u14bf\\u14c0\\u14c1\\u14c2\\u14c3\\u14c4\\u14c5\\u14c6\\u14c7\\u14c8\\u14c9\\u14ca\\u14cb\\u14cc\\u14cd\\u14ce\\u14cf\\u14d0\\u14d1\\u14d2\\u14d3\\u14d4\\u14d5\\u14d6\\u14d7\\u14d8\\u14d9\\u14da\\u14db\\u14dc\\u14dd\\u14de\\u14df\\u14e0\\u14e1\\u14e2\\u14e3\\u14e4\\u14e5\\u14e6\\u14e7\\u14e8\\u14e9\\u14ea\\u14eb\\u14ec\\u14ed\\u14ee\\u14ef\\u14f0\\u14f1\\u14f2\\u14f3\\u14f4\\u14f5\\u14f6\\u14f7\\u14f8\\u14f9\\u14fa\\u14fb\\u14fc\\u14fd\\u14fe\\u14ff\\u1500\\u1501\\u1502\\u1503\\u1504\\u1505\\u1506\\u1507\\u1508\\u1509\\u150a\\u150b\\u150c\\u150d\\u150e\\u150f\\u1510\\u1511\\u1512\\u1513\\u1514\\u1515\\u1516\\u1517\\u1518\\u1519\\u151a\\u151b\\u151c\\u151d\\u151e\\u151f\\u1520\\u1521\\u1522\\u1523\\u1524\\u1525\\u1526\\u1527\\u1528\\u1529\\u152a\\u152b\\u152c\\u152d\\u152e\\u152f\\u1530\\u1531\\u1532\\u1533\\u1534\\u1535\\u1536\\u1537\\u1538\\u1539\\u153a\\u153b\\u153c\\u153d\\u153e\\u153f\\u1540\\u1541\\u1542\\u1543\\u1544\\u1545\\u1546\\u1547\\u1548\\u1549\\u154a\\u154b\\u154c\\u154d\\u154e\\u154f\\u1550\\u1551\\u1552\\u1553\\u1554\\u1555\\u1556\\u1557\\u1558\\u1559\\u155a\\u155b\\u155c\\u155d\\u155e\\u155f\\u1560\\u1561\\u1562\\u1563\\u1564\\u1565\\u1566\\u1567\\u1568\\u1569\\u156a\\u156b\\u156c\\u156d\\u156e\\u156f\\u1570\\u1571\\u1572\\u1573\\u1574\\u1575\\u1576\\u1577\\u1578\\u1579\\u157a\\u157b\\u157c\\u157d\\u157e\\u157f\\u1580\\u1581\\u1582\\u1583\\u1584\\u1585\\u1586\\u1587\\u1588\\u1589\\u158a\\u158b\\u158c\\u158d\\u158e\\u158f\\u1590\\u1591\\u1592\\u1593\\u1594\\u1595\\u1596\\u1597\\u1598\\u1599\\u159a\\u159b\\u159c\\u159d\\u159e\\u159f\\u15a0\\u15a1\\u15a2\\u15a3\\u15a4\\u15a5\\u15a6\\u15a7\\u15a8\\u15a9\\u15aa\\u15ab\\u15ac\\u15ad\\u15ae\\u15af\\u15b0\\u15b1\\u15b2\\u15b3\\u15b4\\u15b5\\u15b6\\u15b7\\u15b8\\u15b9\\u15ba\\u15bb\\u15bc\\u15bd\\u15be\\u15bf\\u15c0\\u15c1\\u15c2\\u15c3\\u15c4\\u15c5\\u15c6\\u15c7\\u15c8\\u15c9\\u15ca\\u15cb\\u15cc\\u15cd\\u15ce\\u15cf\\u15d0\\u15d1\\u15d2\\u15d3\\u15d4\\u15d5\\u15d6\\u15d7\\u15d8\\u15d9\\u15da\\u15db\\u15dc\\u15dd\\u15de\\u15df\\u15e0\\u15e1\\u15e2\\u15e3\\u15e4\\u15e5\\u15e6\\u15e7\\u15e8\\u15e9\\u15ea\\u15eb\\u15ec\\u15ed\\u15ee\\u15ef\\u15f0\\u15f1\\u15f2\\u15f3\\u15f4\\u15f5\\u15f6\\u15f7\\u15f8\\u15f9\\u15fa\\u15fb\\u15fc\\u15fd\\u15fe\\u15ff\\u1600\\u1601\\u1602\\u1603\\u1604\\u1605\\u1606\\u1607\\u1608\\u1609\\u160a\\u160b\\u160c\\u160d\\u160e\\u160f\\u1610\\u1611\\u1612\\u1613\\u1614\\u1615\\u1616\\u1617\\u1618\\u1619\\u161a\\u161b\\u161c\\u161d\\u161e\\u161f\\u1620\\u1621\\u1622\\u1623\\u1624\\u1625\\u1626\\u1627\\u1628\\u1629\\u162a\\u162b\\u162c\\u162d\\u162e\\u162f\\u1630\\u1631\\u1632\\u1633\\u1634\\u1635\\u1636\\u1637\\u1638\\u1639\\u163a\\u163b\\u163c\\u163d\\u163e\\u163f\\u1640\\u1641\\u1642\\u1643\\u1644\\u1645\\u1646\\u1647\\u1648\\u1649\\u164a\\u164b\\u164c\\u164d\\u164e\\u164f\\u1650\\u1651\\u1652\\u1653\\u1654\\u1655\\u1656\\u1657\\u1658\\u1659\\u165a\\u165b\\u165c\\u165d\\u165e\\u165f\\u1660\\u1661\\u1662\\u1663\\u1664\\u1665\\u1666\\u1667\\u1668\\u1669\\u166a\\u166b\\u166c\\u166f\\u1670\\u1671\\u1672\\u1673\\u1674\\u1675\\u1676\\u1681\\u1682\\u1683\\u1684\\u1685\\u1686\\u1687\\u1688\\u1689\\u168a\\u168b\\u168c\\u168d\\u168e\\u168f\\u1690\\u1691\\u1692\\u1693\\u1694\\u1695\\u1696\\u1697\\u1698\\u1699\\u169a\\u16a0\\u16a1\\u16a2\\u16a3\\u16a4\\u16a5\\u16a6\\u16a7\\u16a8\\u16a9\\u16aa\\u16ab\\u16ac\\u16ad\\u16ae\\u16af\\u16b0\\u16b1\\u16b2\\u16b3\\u16b4\\u16b5\\u16b6\\u16b7\\u16b8\\u16b9\\u16ba\\u16bb\\u16bc\\u16bd\\u16be\\u16bf\\u16c0\\u16c1\\u16c2\\u16c3\\u16c4\\u16c5\\u16c6\\u16c7\\u16c8\\u16c9\\u16ca\\u16cb\\u16cc\\u16cd\\u16ce\\u16cf\\u16d0\\u16d1\\u16d2\\u16d3\\u16d4\\u16d5\\u16d6\\u16d7\\u16d8\\u16d9\\u16da\\u16db\\u16dc\\u16dd\\u16de\\u16df\\u16e0\\u16e1\\u16e2\\u16e3\\u16e4\\u16e5\\u16e6\\u16e7\\u16e8\\u16e9\\u16ea\\u1700\\u1701\\u1702\\u1703\\u1704\\u1705\\u1706\\u1707\\u1708\\u1709\\u170a\\u170b\\u170c\\u170e\\u170f\\u1710\\u1711\\u1720\\u1721\\u1722\\u1723\\u1724\\u1725\\u1726\\u1727\\u1728\\u1729\\u172a\\u172b\\u172c\\u172d\\u172e\\u172f\\u1730\\u1731\\u1740\\u1741\\u1742\\u1743\\u1744\\u1745\\u1746\\u1747\\u1748\\u1749\\u174a\\u174b\\u174c\\u174d\\u174e\\u174f\\u1750\\u1751\\u1760\\u1761\\u1762\\u1763\\u1764\\u1765\\u1766\\u1767\\u1768\\u1769\\u176a\\u176b\\u176c\\u176e\\u176f\\u1770\\u1780\\u1781\\u1782\\u1783\\u1784\\u1785\\u1786\\u1787\\u1788\\u1789\\u178a\\u178b\\u178c\\u178d\\u178e\\u178f\\u1790\\u1791\\u1792\\u1793\\u1794\\u1795\\u1796\\u1797\\u1798\\u1799\\u179a\\u179b\\u179c\\u179d\\u179e\\u179f\\u17a0\\u17a1\\u17a2\\u17a3\\u17a4\\u17a5\\u17a6\\u17a7\\u17a8\\u17a9\\u17aa\\u17ab\\u17ac\\u17ad\\u17ae\\u17af\\u17b0\\u17b1\\u17b2\\u17b3\\u17dc\\u1820\\u1821\\u1822\\u1823\\u1824\\u1825\\u1826\\u1827\\u1828\\u1829\\u182a\\u182b\\u182c\\u182d\\u182e\\u182f\\u1830\\u1831\\u1832\\u1833\\u1834\\u1835\\u1836\\u1837\\u1838\\u1839\\u183a\\u183b\\u183c\\u183d\\u183e\\u183f\\u1840\\u1841\\u1842\\u1844\\u1845\\u1846\\u1847\\u1848\\u1849\\u184a\\u184b\\u184c\\u184d\\u184e\\u184f\\u1850\\u1851\\u1852\\u1853\\u1854\\u1855\\u1856\\u1857\\u1858\\u1859\\u185a\\u185b\\u185c\\u185d\\u185e\\u185f\\u1860\\u1861\\u1862\\u1863\\u1864\\u1865\\u1866\\u1867\\u1868\\u1869\\u186a\\u186b\\u186c\\u186d\\u186e\\u186f\\u1870\\u1871\\u1872\\u1873\\u1874\\u1875\\u1876\\u1877\\u1880\\u1881\\u1882\\u1883\\u1884\\u1885\\u1886\\u1887\\u1888\\u1889\\u188a\\u188b\\u188c\\u188d\\u188e\\u188f\\u1890\\u1891\\u1892\\u1893\\u1894\\u1895\\u1896\\u1897\\u1898\\u1899\\u189a\\u189b\\u189c\\u189d\\u189e\\u189f\\u18a0\\u18a1\\u18a2\\u18a3\\u18a4\\u18a5\\u18a6\\u18a7\\u18a8\\u1900\\u1901\\u1902\\u1903\\u1904\\u1905\\u1906\\u1907\\u1908\\u1909\\u190a\\u190b\\u190c\\u190d\\u190e\\u190f\\u1910\\u1911\\u1912\\u1913\\u1914\\u1915\\u1916\\u1917\\u1918\\u1919\\u191a\\u191b\\u191c\\u1950\\u1951\\u1952\\u1953\\u1954\\u1955\\u1956\\u1957\\u1958\\u1959\\u195a\\u195b\\u195c\\u195d\\u195e\\u195f\\u1960\\u1961\\u1962\\u1963\\u1964\\u1965\\u1966\\u1967\\u1968\\u1969\\u196a\\u196b\\u196c\\u196d\\u1970\\u1971\\u1972\\u1973\\u1974\\u1980\\u1981\\u1982\\u1983\\u1984\\u1985\\u1986\\u1987\\u1988\\u1989\\u198a\\u198b\\u198c\\u198d\\u198e\\u198f\\u1990\\u1991\\u1992\\u1993\\u1994\\u1995\\u1996\\u1997\\u1998\\u1999\\u199a\\u199b\\u199c\\u199d\\u199e\\u199f\\u19a0\\u19a1\\u19a2\\u19a3\\u19a4\\u19a5\\u19a6\\u19a7\\u19a8\\u19a9\\u19c1\\u19c2\\u19c3\\u19c4\\u19c5\\u19c6\\u19c7\\u1a00\\u1a01\\u1a02\\u1a03\\u1a04\\u1a05\\u1a06\\u1a07\\u1a08\\u1a09\\u1a0a\\u1a0b\\u1a0c\\u1a0d\\u1a0e\\u1a0f\\u1a10\\u1a11\\u1a12\\u1a13\\u1a14\\u1a15\\u1a16\\u2135\\u2136\\u2137\\u2138\\u2d30\\u2d31\\u2d32\\u2d33\\u2d34\\u2d35\\u2d36\\u2d37\\u2d38\\u2d39\\u2d3a\\u2d3b\\u2d3c\\u2d3d\\u2d3e\\u2d3f\\u2d40\\u2d41\\u2d42\\u2d43\\u2d44\\u2d45\\u2d46\\u2d47\\u2d48\\u2d49\\u2d4a\\u2d4b\\u2d4c\\u2d4d\\u2d4e\\u2d4f\\u2d50\\u2d51\\u2d52\\u2d53\\u2d54\\u2d55\\u2d56\\u2d57\\u2d58\\u2d59\\u2d5a\\u2d5b\\u2d5c\\u2d5d\\u2d5e\\u2d5f\\u2d60\\u2d61\\u2d62\\u2d63\\u2d64\\u2d65\\u2d80\\u2d81\\u2d82\\u2d83\\u2d84\\u2d85\\u2d86\\u2d87\\u2d88\\u2d89\\u2d8a\\u2d8b\\u2d8c\\u2d8d\\u2d8e\\u2d8f\\u2d90\\u2d91\\u2d92\\u2d93\\u2d94\\u2d95\\u2d96\\u2da0\\u2da1\\u2da2\\u2da3\\u2da4\\u2da5\\u2da6\\u2da8\\u2da9\\u2daa\\u2dab\\u2dac\\u2dad\\u2dae\\u2db0\\u2db1\\u2db2\\u2db3\\u2db4\\u2db5\\u2db6\\u2db8\\u2db9\\u2dba\\u2dbb\\u2dbc\\u2dbd\\u2dbe\\u2dc0\\u2dc1\\u2dc2\\u2dc3\\u2dc4\\u2dc5\\u2dc6\\u2dc8\\u2dc9\\u2dca\\u2dcb\\u2dcc\\u2dcd\\u2dce\\u2dd0\\u2dd1\\u2dd2\\u2dd3\\u2dd4\\u2dd5\\u2dd6\\u2dd8\\u2dd9\\u2dda\\u2ddb\\u2ddc\\u2ddd\\u2dde\\u3006\\u303c\\u3041\\u3042\\u3043\\u3044\\u3045\\u3046\\u3047\\u3048\\u3049\\u304a\\u304b\\u304c\\u304d\\u304e\\u304f\\u3050\\u3051\\u3052\\u3053\\u3054\\u3055\\u3056\\u3057\\u3058\\u3059\\u305a\\u305b\\u305c\\u305d\\u305e\\u305f\\u3060\\u3061\\u3062\\u3063\\u3064\\u3065\\u3066\\u3067\\u3068\\u3069\\u306a\\u306b\\u306c\\u306d\\u306e\\u306f\\u3070\\u3071\\u3072\\u3073\\u3074\\u3075\\u3076\\u3077\\u3078\\u3079\\u307a\\u307b\\u307c\\u307d\\u307e\\u307f\\u3080\\u3081\\u3082\\u3083\\u3084\\u3085\\u3086\\u3087\\u3088\\u3089\\u308a\\u308b\\u308c\\u308d\\u308e\\u308f\\u3090\\u3091\\u3092\\u3093\\u3094\\u3095\\u3096\\u309f\\u30a1\\u30a2\\u30a3\\u30a4\\u30a5\\u30a6\\u30a7\\u30a8\\u30a9\\u30aa\\u30ab\\u30ac\\u30ad\\u30ae\\u30af\\u30b0\\u30b1\\u30b2\\u30b3\\u30b4\\u30b5\\u30b6\\u30b7\\u30b8\\u30b9\\u30ba\\u30bb\\u30bc\\u30bd\\u30be\\u30bf\\u30c0\\u30c1\\u30c2\\u30c3\\u30c4\\u30c5\\u30c6\\u30c7\\u30c8\\u30c9\\u30ca\\u30cb\\u30cc\\u30cd\\u30ce\\u30cf\\u30d0\\u30d1\\u30d2\\u30d3\\u30d4\\u30d5\\u30d6\\u30d7\\u30d8\\u30d9\\u30da\\u30db\\u30dc\\u30dd\\u30de\\u30df\\u30e0\\u30e1\\u30e2\\u30e3\\u30e4\\u30e5\\u30e6\\u30e7\\u30e8\\u30e9\\u30ea\\u30eb\\u30ec\\u30ed\\u30ee\\u30ef\\u30f0\\u30f1\\u30f2\\u30f3\\u30f4\\u30f5\\u30f6\\u30f7\\u30f8\\u30f9\\u30fa\\u30ff\\u3105\\u3106\\u3107\\u3108\\u3109\\u310a\\u310b\\u310c\\u310d\\u310e\\u310f\\u3110\\u3111\\u3112\\u3113\\u3114\\u3115\\u3116\\u3117\\u3118\\u3119\\u311a\\u311b\\u311c\\u311d\\u311e\\u311f\\u3120\\u3121\\u3122\\u3123\\u3124\\u3125\\u3126\\u3127\\u3128\\u3129\\u312a\\u312b\\u312c\\u3131\\u3132\\u3133\\u3134\\u3135\\u3136\\u3137\\u3138\\u3139\\u313a\\u313b\\u313c\\u313d\\u313e\\u313f\\u3140\\u3141\\u3142\\u3143\\u3144\\u3145\\u3146\\u3147\\u3148\\u3149\\u314a\\u314b\\u314c\\u314d\\u314e\\u314f\\u3150\\u3151\\u3152\\u3153\\u3154\\u3155\\u3156\\u3157\\u3158\\u3159\\u315a\\u315b\\u315c\\u315d\\u315e\\u315f\\u3160\\u3161\\u3162\\u3163\\u3164\\u3165\\u3166\\u3167\\u3168\\u3169\\u316a\\u316b\\u316c\\u316d\\u316e\\u316f\\u3170\\u3171\\u3172\\u3173\\u3174\\u3175\\u3176\\u3177\\u3178\\u3179\\u317a\\u317b\\u317c\\u317d\\u317e\\u317f\\u3180\\u3181\\u3182\\u3183\\u3184\\u3185\\u3186\\u3187\\u3188\\u3189\\u318a\\u318b\\u318c\\u318d\\u318e\\u31a0\\u31a1\\u31a2\\u31a3\\u31a4\\u31a5\\u31a6\\u31a7\\u31a8\\u31a9\\u31aa\\u31ab\\u31ac\\u31ad\\u31ae\\u31af\\u31b0\\u31b1\\u31b2\\u31b3\\u31b4\\u31b5\\u31b6\\u31b7\\u31f0\\u31f1\\u31f2\\u31f3\\u31f4\\u31f5\\u31f6\\u31f7\\u31f8\\u31f9\\u31fa\\u31fb\\u31fc\\u31fd\\u31fe\\u31ff\\u3400\\u3401\\u3402\\u3403\\u3404\\u3405\\u3406\\u3407\\u3408\\u3409\\u340a\\u340b\\u340c\\u340d\\u340e\\u340f\\u3410\\u3411\\u3412\\u3413\\u3414\\u3415\\u3416\\u3417\\u3418\\u3419\\u341a\\u341b\\u341c\\u341d\\u341e\\u341f\\u3420\\u3421\\u3422\\u3423\\u3424\\u3425\\u3426\\u3427\\u3428\\u3429\\u342a\\u342b\\u342c\\u342d\\u342e\\u342f\\u3430\\u3431\\u3432\\u3433\\u3434\\u3435\\u3436\\u3437\\u3438\\u3439\\u343a\\u343b\\u343c\\u343d\\u343e\\u343f\\u3440\\u3441\\u3442\\u3443\\u3444\\u3445\\u3446\\u3447\\u3448\\u3449\\u344a\\u344b\\u344c\\u344d\\u344e\\u344f\\u3450\\u3451\\u3452\\u3453\\u3454\\u3455\\u3456\\u3457\\u3458\\u3459\\u345a\\u345b\\u345c\\u345d\\u345e\\u345f\\u3460\\u3461\\u3462\\u3463\\u3464\\u3465\\u3466\\u3467\\u3468\\u3469\\u346a\\u346b\\u346c\\u346d\\u346e\\u346f\\u3470\\u3471\\u3472\\u3473\\u3474\\u3475\\u3476\\u3477\\u3478\\u3479\\u347a\\u347b\\u347c\\u347d\\u347e\\u347f\\u3480\\u3481\\u3482\\u3483\\u3484\\u3485\\u3486\\u3487\\u3488\\u3489\\u348a\\u348b\\u348c\\u348d\\u348e\\u348f\\u3490\\u3491\\u3492\\u3493\\u3494\\u3495\\u3496\\u3497\\u3498\\u3499\\u349a\\u349b\\u349c\\u349d\\u349e\\u349f\\u34a0\\u34a1\\u34a2\\u34a3\\u34a4\\u34a5\\u34a6\\u34a7\\u34a8\\u34a9\\u34aa\\u34ab\\u34ac\\u34ad\\u34ae\\u34af\\u34b0\\u34b1\\u34b2\\u34b3\\u34b4\\u34b5\\u34b6\\u34b7\\u34b8\\u34b9\\u34ba\\u34bb\\u34bc\\u34bd\\u34be\\u34bf\\u34c0\\u34c1\\u34c2\\u34c3\\u34c4\\u34c5\\u34c6\\u34c7\\u34c8\\u34c9\\u34ca\\u34cb\\u34cc\\u34cd\\u34ce\\u34cf\\u34d0\\u34d1\\u34d2\\u34d3\\u34d4\\u34d5\\u34d6\\u34d7\\u34d8\\u34d9\\u34da\\u34db\\u34dc\\u34dd\\u34de\\u34df\\u34e0\\u34e1\\u34e2\\u34e3\\u34e4\\u34e5\\u34e6\\u34e7\\u34e8\\u34e9\\u34ea\\u34eb\\u34ec\\u34ed\\u34ee\\u34ef\\u34f0\\u34f1\\u34f2\\u34f3\\u34f4\\u34f5\\u34f6\\u34f7\\u34f8\\u34f9\\u34fa\\u34fb\\u34fc\\u34fd\\u34fe\\u34ff\\u3500\\u3501\\u3502\\u3503\\u3504\\u3505\\u3506\\u3507\\u3508\\u3509\\u350a\\u350b\\u350c\\u350d\\u350e\\u350f\\u3510\\u3511\\u3512\\u3513\\u3514\\u3515\\u3516\\u3517\\u3518\\u3519\\u351a\\u351b\\u351c\\u351d\\u351e\\u351f\\u3520\\u3521\\u3522\\u3523\\u3524\\u3525\\u3526\\u3527\\u3528\\u3529\\u352a\\u352b\\u352c\\u352d\\u352e\\u352f\\u3530\\u3531\\u3532\\u3533\\u3534\\u3535\\u3536\\u3537\\u3538\\u3539\\u353a\\u353b\\u353c\\u353d\\u353e\\u353f\\u3540\\u3541\\u3542\\u3543\\u3544\\u3545\\u3546\\u3547\\u3548\\u3549\\u354a\\u354b\\u354c\\u354d\\u354e\\u354f\\u3550\\u3551\\u3552\\u3553\\u3554\\u3555\\u3556\\u3557\\u3558\\u3559\\u355a\\u355b\\u355c\\u355d\\u355e\\u355f\\u3560\\u3561\\u3562\\u3563\\u3564\\u3565\\u3566\\u3567\\u3568\\u3569\\u356a\\u356b\\u356c\\u356d\\u356e\\u356f\\u3570\\u3571\\u3572\\u3573\\u3574\\u3575\\u3576\\u3577\\u3578\\u3579\\u357a\\u357b\\u357c\\u357d\\u357e\\u357f\\u3580\\u3581\\u3582\\u3583\\u3584\\u3585\\u3586\\u3587\\u3588\\u3589\\u358a\\u358b\\u358c\\u358d\\u358e\\u358f\\u3590\\u3591\\u3592\\u3593\\u3594\\u3595\\u3596\\u3597\\u3598\\u3599\\u359a\\u359b\\u359c\\u359d\\u359e\\u359f\\u35a0\\u35a1\\u35a2\\u35a3\\u35a4\\u35a5\\u35a6\\u35a7\\u35a8\\u35a9\\u35aa\\u35ab\\u35ac\\u35ad\\u35ae\\u35af\\u35b0\\u35b1\\u35b2\\u35b3\\u35b4\\u35b5\\u35b6\\u35b7\\u35b8\\u35b9\\u35ba\\u35bb\\u35bc\\u35bd\\u35be\\u35bf\\u35c0\\u35c1\\u35c2\\u35c3\\u35c4\\u35c5\\u35c6\\u35c7\\u35c8\\u35c9\\u35ca\\u35cb\\u35cc\\u35cd\\u35ce\\u35cf\\u35d0\\u35d1\\u35d2\\u35d3\\u35d4\\u35d5\\u35d6\\u35d7\\u35d8\\u35d9\\u35da\\u35db\\u35dc\\u35dd\\u35de\\u35df\\u35e0\\u35e1\\u35e2\\u35e3\\u35e4\\u35e5\\u35e6\\u35e7\\u35e8\\u35e9\\u35ea\\u35eb\\u35ec\\u35ed\\u35ee\\u35ef\\u35f0\\u35f1\\u35f2\\u35f3\\u35f4\\u35f5\\u35f6\\u35f7\\u35f8\\u35f9\\u35fa\\u35fb\\u35fc\\u35fd\\u35fe\\u35ff\\u3600\\u3601\\u3602\\u3603\\u3604\\u3605\\u3606\\u3607\\u3608\\u3609\\u360a\\u360b\\u360c\\u360d\\u360e\\u360f\\u3610\\u3611\\u3612\\u3613\\u3614\\u3615\\u3616\\u3617\\u3618\\u3619\\u361a\\u361b\\u361c\\u361d\\u361e\\u361f\\u3620\\u3621\\u3622\\u3623\\u3624\\u3625\\u3626\\u3627\\u3628\\u3629\\u362a\\u362b\\u362c\\u362d\\u362e\\u362f\\u3630\\u3631\\u3632\\u3633\\u3634\\u3635\\u3636\\u3637\\u3638\\u3639\\u363a\\u363b\\u363c\\u363d\\u363e\\u363f\\u3640\\u3641\\u3642\\u3643\\u3644\\u3645\\u3646\\u3647\\u3648\\u3649\\u364a\\u364b\\u364c\\u364d\\u364e\\u364f\\u3650\\u3651\\u3652\\u3653\\u3654\\u3655\\u3656\\u3657\\u3658\\u3659\\u365a\\u365b\\u365c\\u365d\\u365e\\u365f\\u3660\\u3661\\u3662\\u3663\\u3664\\u3665\\u3666\\u3667\\u3668\\u3669\\u366a\\u366b\\u366c\\u366d\\u366e\\u366f\\u3670\\u3671\\u3672\\u3673\\u3674\\u3675\\u3676\\u3677\\u3678\\u3679\\u367a\\u367b\\u367c\\u367d\\u367e\\u367f\\u3680\\u3681\\u3682\\u3683\\u3684\\u3685\\u3686\\u3687\\u3688\\u3689\\u368a\\u368b\\u368c\\u368d\\u368e\\u368f\\u3690\\u3691\\u3692\\u3693\\u3694\\u3695\\u3696\\u3697\\u3698\\u3699\\u369a\\u369b\\u369c\\u369d\\u369e\\u369f\\u36a0\\u36a1\\u36a2\\u36a3\\u36a4\\u36a5\\u36a6\\u36a7\\u36a8\\u36a9\\u36aa\\u36ab\\u36ac\\u36ad\\u36ae\\u36af\\u36b0\\u36b1\\u36b2\\u36b3\\u36b4\\u36b5\\u36b6\\u36b7\\u36b8\\u36b9\\u36ba\\u36bb\\u36bc\\u36bd\\u36be\\u36bf\\u36c0\\u36c1\\u36c2\\u36c3\\u36c4\\u36c5\\u36c6\\u36c7\\u36c8\\u36c9\\u36ca\\u36cb\\u36cc\\u36cd\\u36ce\\u36cf\\u36d0\\u36d1\\u36d2\\u36d3\\u36d4\\u36d5\\u36d6\\u36d7\\u36d8\\u36d9\\u36da\\u36db\\u36dc\\u36dd\\u36de\\u36df\\u36e0\\u36e1\\u36e2\\u36e3\\u36e4\\u36e5\\u36e6\\u36e7\\u36e8\\u36e9\\u36ea\\u36eb\\u36ec\\u36ed\\u36ee\\u36ef\\u36f0\\u36f1\\u36f2\\u36f3\\u36f4\\u36f5\\u36f6\\u36f7\\u36f8\\u36f9\\u36fa\\u36fb\\u36fc\\u36fd\\u36fe\\u36ff\\u3700\\u3701\\u3702\\u3703\\u3704\\u3705\\u3706\\u3707\\u3708\\u3709\\u370a\\u370b\\u370c\\u370d\\u370e\\u370f\\u3710\\u3711\\u3712\\u3713\\u3714\\u3715\\u3716\\u3717\\u3718\\u3719\\u371a\\u371b\\u371c\\u371d\\u371e\\u371f\\u3720\\u3721\\u3722\\u3723\\u3724\\u3725\\u3726\\u3727\\u3728\\u3729\\u372a\\u372b\\u372c\\u372d\\u372e\\u372f\\u3730\\u3731\\u3732\\u3733\\u3734\\u3735\\u3736\\u3737\\u3738\\u3739\\u373a\\u373b\\u373c\\u373d\\u373e\\u373f\\u3740\\u3741\\u3742\\u3743\\u3744\\u3745\\u3746\\u3747\\u3748\\u3749\\u374a\\u374b\\u374c\\u374d\\u374e\\u374f\\u3750\\u3751\\u3752\\u3753\\u3754\\u3755\\u3756\\u3757\\u3758\\u3759\\u375a\\u375b\\u375c\\u375d\\u375e\\u375f\\u3760\\u3761\\u3762\\u3763\\u3764\\u3765\\u3766\\u3767\\u3768\\u3769\\u376a\\u376b\\u376c\\u376d\\u376e\\u376f\\u3770\\u3771\\u3772\\u3773\\u3774\\u3775\\u3776\\u3777\\u3778\\u3779\\u377a\\u377b\\u377c\\u377d\\u377e\\u377f\\u3780\\u3781\\u3782\\u3783\\u3784\\u3785\\u3786\\u3787\\u3788\\u3789\\u378a\\u378b\\u378c\\u378d\\u378e\\u378f\\u3790\\u3791\\u3792\\u3793\\u3794\\u3795\\u3796\\u3797\\u3798\\u3799\\u379a\\u379b\\u379c\\u379d\\u379e\\u379f\\u37a0\\u37a1\\u37a2\\u37a3\\u37a4\\u37a5\\u37a6\\u37a7\\u37a8\\u37a9\\u37aa\\u37ab\\u37ac\\u37ad\\u37ae\\u37af\\u37b0\\u37b1\\u37b2\\u37b3\\u37b4\\u37b5\\u37b6\\u37b7\\u37b8\\u37b9\\u37ba\\u37bb\\u37bc\\u37bd\\u37be\\u37bf\\u37c0\\u37c1\\u37c2\\u37c3\\u37c4\\u37c5\\u37c6\\u37c7\\u37c8\\u37c9\\u37ca\\u37cb\\u37cc\\u37cd\\u37ce\\u37cf\\u37d0\\u37d1\\u37d2\\u37d3\\u37d4\\u37d5\\u37d6\\u37d7\\u37d8\\u37d9\\u37da\\u37db\\u37dc\\u37dd\\u37de\\u37df\\u37e0\\u37e1\\u37e2\\u37e3\\u37e4\\u37e5\\u37e6\\u37e7\\u37e8\\u37e9\\u37ea\\u37eb\\u37ec\\u37ed\\u37ee\\u37ef\\u37f0\\u37f1\\u37f2\\u37f3\\u37f4\\u37f5\\u37f6\\u37f7\\u37f8\\u37f9\\u37fa\\u37fb\\u37fc\\u37fd\\u37fe\\u37ff\\u3800\\u3801\\u3802\\u3803\\u3804\\u3805\\u3806\\u3807\\u3808\\u3809\\u380a\\u380b\\u380c\\u380d\\u380e\\u380f\\u3810\\u3811\\u3812\\u3813\\u3814\\u3815\\u3816\\u3817\\u3818\\u3819\\u381a\\u381b\\u381c\\u381d\\u381e\\u381f\\u3820\\u3821\\u3822\\u3823\\u3824\\u3825\\u3826\\u3827\\u3828\\u3829\\u382a\\u382b\\u382c\\u382d\\u382e\\u382f\\u3830\\u3831\\u3832\\u3833\\u3834\\u3835\\u3836\\u3837\\u3838\\u3839\\u383a\\u383b\\u383c\\u383d\\u383e\\u383f\\u3840\\u3841\\u3842\\u3843\\u3844\\u3845\\u3846\\u3847\\u3848\\u3849\\u384a\\u384b\\u384c\\u384d\\u384e\\u384f\\u3850\\u3851\\u3852\\u3853\\u3854\\u3855\\u3856\\u3857\\u3858\\u3859\\u385a\\u385b\\u385c\\u385d\\u385e\\u385f\\u3860\\u3861\\u3862\\u3863\\u3864\\u3865\\u3866\\u3867\\u3868\\u3869\\u386a\\u386b\\u386c\\u386d\\u386e\\u386f\\u3870\\u3871\\u3872\\u3873\\u3874\\u3875\\u3876\\u3877\\u3878\\u3879\\u387a\\u387b\\u387c\\u387d\\u387e\\u387f\\u3880\\u3881\\u3882\\u3883\\u3884\\u3885\\u3886\\u3887\\u3888\\u3889\\u388a\\u388b\\u388c\\u388d\\u388e\\u388f\\u3890\\u3891\\u3892\\u3893\\u3894\\u3895\\u3896\\u3897\\u3898\\u3899\\u389a\\u389b\\u389c\\u389d\\u389e\\u389f\\u38a0\\u38a1\\u38a2\\u38a3\\u38a4\\u38a5\\u38a6\\u38a7\\u38a8\\u38a9\\u38aa\\u38ab\\u38ac\\u38ad\\u38ae\\u38af\\u38b0\\u38b1\\u38b2\\u38b3\\u38b4\\u38b5\\u38b6\\u38b7\\u38b8\\u38b9\\u38ba\\u38bb\\u38bc\\u38bd\\u38be\\u38bf\\u38c0\\u38c1\\u38c2\\u38c3\\u38c4\\u38c5\\u38c6\\u38c7\\u38c8\\u38c9\\u38ca\\u38cb\\u38cc\\u38cd\\u38ce\\u38cf\\u38d0\\u38d1\\u38d2\\u38d3\\u38d4\\u38d5\\u38d6\\u38d7\\u38d8\\u38d9\\u38da\\u38db\\u38dc\\u38dd\\u38de\\u38df\\u38e0\\u38e1\\u38e2\\u38e3\\u38e4\\u38e5\\u38e6\\u38e7\\u38e8\\u38e9\\u38ea\\u38eb\\u38ec\\u38ed\\u38ee\\u38ef\\u38f0\\u38f1\\u38f2\\u38f3\\u38f4\\u38f5\\u38f6\\u38f7\\u38f8\\u38f9\\u38fa\\u38fb\\u38fc\\u38fd\\u38fe\\u38ff\\u3900\\u3901\\u3902\\u3903\\u3904\\u3905\\u3906\\u3907\\u3908\\u3909\\u390a\\u390b\\u390c\\u390d\\u390e\\u390f\\u3910\\u3911\\u3912\\u3913\\u3914\\u3915\\u3916\\u3917\\u3918\\u3919\\u391a\\u391b\\u391c\\u391d\\u391e\\u391f\\u3920\\u3921\\u3922\\u3923\\u3924\\u3925\\u3926\\u3927\\u3928\\u3929\\u392a\\u392b\\u392c\\u392d\\u392e\\u392f\\u3930\\u3931\\u3932\\u3933\\u3934\\u3935\\u3936\\u3937\\u3938\\u3939\\u393a\\u393b\\u393c\\u393d\\u393e\\u393f\\u3940\\u3941\\u3942\\u3943\\u3944\\u3945\\u3946\\u3947\\u3948\\u3949\\u394a\\u394b\\u394c\\u394d\\u394e\\u394f\\u3950\\u3951\\u3952\\u3953\\u3954\\u3955\\u3956\\u3957\\u3958\\u3959\\u395a\\u395b\\u395c\\u395d\\u395e\\u395f\\u3960\\u3961\\u3962\\u3963\\u3964\\u3965\\u3966\\u3967\\u3968\\u3969\\u396a\\u396b\\u396c\\u396d\\u396e\\u396f\\u3970\\u3971\\u3972\\u3973\\u3974\\u3975\\u3976\\u3977\\u3978\\u3979\\u397a\\u397b\\u397c\\u397d\\u397e\\u397f\\u3980\\u3981\\u3982\\u3983\\u3984\\u3985\\u3986\\u3987\\u3988\\u3989\\u398a\\u398b\\u398c\\u398d\\u398e\\u398f\\u3990\\u3991\\u3992\\u3993\\u3994\\u3995\\u3996\\u3997\\u3998\\u3999\\u399a\\u399b\\u399c\\u399d\\u399e\\u399f\\u39a0\\u39a1\\u39a2\\u39a3\\u39a4\\u39a5\\u39a6\\u39a7\\u39a8\\u39a9\\u39aa\\u39ab\\u39ac\\u39ad\\u39ae\\u39af\\u39b0\\u39b1\\u39b2\\u39b3\\u39b4\\u39b5\\u39b6\\u39b7\\u39b8\\u39b9\\u39ba\\u39bb\\u39bc\\u39bd\\u39be\\u39bf\\u39c0\\u39c1\\u39c2\\u39c3\\u39c4\\u39c5\\u39c6\\u39c7\\u39c8\\u39c9\\u39ca\\u39cb\\u39cc\\u39cd\\u39ce\\u39cf\\u39d0\\u39d1\\u39d2\\u39d3\\u39d4\\u39d5\\u39d6\\u39d7\\u39d8\\u39d9\\u39da\\u39db\\u39dc\\u39dd\\u39de\\u39df\\u39e0\\u39e1\\u39e2\\u39e3\\u39e4\\u39e5\\u39e6\\u39e7\\u39e8\\u39e9\\u39ea\\u39eb\\u39ec\\u39ed\\u39ee\\u39ef\\u39f0\\u39f1\\u39f2\\u39f3\\u39f4\\u39f5\\u39f6\\u39f7\\u39f8\\u39f9\\u39fa\\u39fb\\u39fc\\u39fd\\u39fe\\u39ff\\u3a00\\u3a01\\u3a02\\u3a03\\u3a04\\u3a05\\u3a06\\u3a07\\u3a08\\u3a09\\u3a0a\\u3a0b\\u3a0c\\u3a0d\\u3a0e\\u3a0f\\u3a10\\u3a11\\u3a12\\u3a13\\u3a14\\u3a15\\u3a16\\u3a17\\u3a18\\u3a19\\u3a1a\\u3a1b\\u3a1c\\u3a1d\\u3a1e\\u3a1f\\u3a20\\u3a21\\u3a22\\u3a23\\u3a24\\u3a25\\u3a26\\u3a27\\u3a28\\u3a29\\u3a2a\\u3a2b\\u3a2c\\u3a2d\\u3a2e\\u3a2f\\u3a30\\u3a31\\u3a32\\u3a33\\u3a34\\u3a35\\u3a36\\u3a37\\u3a38\\u3a39\\u3a3a\\u3a3b\\u3a3c\\u3a3d\\u3a3e\\u3a3f\\u3a40\\u3a41\\u3a42\\u3a43\\u3a44\\u3a45\\u3a46\\u3a47\\u3a48\\u3a49\\u3a4a\\u3a4b\\u3a4c\\u3a4d\\u3a4e\\u3a4f\\u3a50\\u3a51\\u3a52\\u3a53\\u3a54\\u3a55\\u3a56\\u3a57\\u3a58\\u3a59\\u3a5a\\u3a5b\\u3a5c\\u3a5d\\u3a5e\\u3a5f\\u3a60\\u3a61\\u3a62\\u3a63\\u3a64\\u3a65\\u3a66\\u3a67\\u3a68\\u3a69\\u3a6a\\u3a6b\\u3a6c\\u3a6d\\u3a6e\\u3a6f\\u3a70\\u3a71\\u3a72\\u3a73\\u3a74\\u3a75\\u3a76\\u3a77\\u3a78\\u3a79\\u3a7a\\u3a7b\\u3a7c\\u3a7d\\u3a7e\\u3a7f\\u3a80\\u3a81\\u3a82\\u3a83\\u3a84\\u3a85\\u3a86\\u3a87\\u3a88\\u3a89\\u3a8a\\u3a8b\\u3a8c\\u3a8d\\u3a8e\\u3a8f\\u3a90\\u3a91\\u3a92\\u3a93\\u3a94\\u3a95\\u3a96\\u3a97\\u3a98\\u3a99\\u3a9a\\u3a9b\\u3a9c\\u3a9d\\u3a9e\\u3a9f\\u3aa0\\u3aa1\\u3aa2\\u3aa3\\u3aa4\\u3aa5\\u3aa6\\u3aa7\\u3aa8\\u3aa9\\u3aaa\\u3aab\\u3aac\\u3aad\\u3aae\\u3aaf\\u3ab0\\u3ab1\\u3ab2\\u3ab3\\u3ab4\\u3ab5\\u3ab6\\u3ab7\\u3ab8\\u3ab9\\u3aba\\u3abb\\u3abc\\u3abd\\u3abe\\u3abf\\u3ac0\\u3ac1\\u3ac2\\u3ac3\\u3ac4\\u3ac5\\u3ac6\\u3ac7\\u3ac8\\u3ac9\\u3aca\\u3acb\\u3acc\\u3acd\\u3ace\\u3acf\\u3ad0\\u3ad1\\u3ad2\\u3ad3\\u3ad4\\u3ad5\\u3ad6\\u3ad7\\u3ad8\\u3ad9\\u3ada\\u3adb\\u3adc\\u3add\\u3ade\\u3adf\\u3ae0\\u3ae1\\u3ae2\\u3ae3\\u3ae4\\u3ae5\\u3ae6\\u3ae7\\u3ae8\\u3ae9\\u3aea\\u3aeb\\u3aec\\u3aed\\u3aee\\u3aef\\u3af0\\u3af1\\u3af2\\u3af3\\u3af4\\u3af5\\u3af6\\u3af7\\u3af8\\u3af9\\u3afa\\u3afb\\u3afc\\u3afd\\u3afe\\u3aff\\u3b00\\u3b01\\u3b02\\u3b03\\u3b04\\u3b05\\u3b06\\u3b07\\u3b08\\u3b09\\u3b0a\\u3b0b\\u3b0c\\u3b0d\\u3b0e\\u3b0f\\u3b10\\u3b11\\u3b12\\u3b13\\u3b14\\u3b15\\u3b16\\u3b17\\u3b18\\u3b19\\u3b1a\\u3b1b\\u3b1c\\u3b1d\\u3b1e\\u3b1f\\u3b20\\u3b21\\u3b22\\u3b23\\u3b24\\u3b25\\u3b26\\u3b27\\u3b28\\u3b29\\u3b2a\\u3b2b\\u3b2c\\u3b2d\\u3b2e\\u3b2f\\u3b30\\u3b31\\u3b32\\u3b33\\u3b34\\u3b35\\u3b36\\u3b37\\u3b38\\u3b39\\u3b3a\\u3b3b\\u3b3c\\u3b3d\\u3b3e\\u3b3f\\u3b40\\u3b41\\u3b42\\u3b43\\u3b44\\u3b45\\u3b46\\u3b47\\u3b48\\u3b49\\u3b4a\\u3b4b\\u3b4c\\u3b4d\\u3b4e\\u3b4f\\u3b50\\u3b51\\u3b52\\u3b53\\u3b54\\u3b55\\u3b56\\u3b57\\u3b58\\u3b59\\u3b5a\\u3b5b\\u3b5c\\u3b5d\\u3b5e\\u3b5f\\u3b60\\u3b61\\u3b62\\u3b63\\u3b64\\u3b65\\u3b66\\u3b67\\u3b68\\u3b69\\u3b6a\\u3b6b\\u3b6c\\u3b6d\\u3b6e\\u3b6f\\u3b70\\u3b71\\u3b72\\u3b73\\u3b74\\u3b75\\u3b76\\u3b77\\u3b78\\u3b79\\u3b7a\\u3b7b\\u3b7c\\u3b7d\\u3b7e\\u3b7f\\u3b80\\u3b81\\u3b82\\u3b83\\u3b84\\u3b85\\u3b86\\u3b87\\u3b88\\u3b89\\u3b8a\\u3b8b\\u3b8c\\u3b8d\\u3b8e\\u3b8f\\u3b90\\u3b91\\u3b92\\u3b93\\u3b94\\u3b95\\u3b96\\u3b97\\u3b98\\u3b99\\u3b9a\\u3b9b\\u3b9c\\u3b9d\\u3b9e\\u3b9f\\u3ba0\\u3ba1\\u3ba2\\u3ba3\\u3ba4\\u3ba5\\u3ba6\\u3ba7\\u3ba8\\u3ba9\\u3baa\\u3bab\\u3bac\\u3bad\\u3bae\\u3baf\\u3bb0\\u3bb1\\u3bb2\\u3bb3\\u3bb4\\u3bb5\\u3bb6\\u3bb7\\u3bb8\\u3bb9\\u3bba\\u3bbb\\u3bbc\\u3bbd\\u3bbe\\u3bbf\\u3bc0\\u3bc1\\u3bc2\\u3bc3\\u3bc4\\u3bc5\\u3bc6\\u3bc7\\u3bc8\\u3bc9\\u3bca\\u3bcb\\u3bcc\\u3bcd\\u3bce\\u3bcf\\u3bd0\\u3bd1\\u3bd2\\u3bd3\\u3bd4\\u3bd5\\u3bd6\\u3bd7\\u3bd8\\u3bd9\\u3bda\\u3bdb\\u3bdc\\u3bdd\\u3bde\\u3bdf\\u3be0\\u3be1\\u3be2\\u3be3\\u3be4\\u3be5\\u3be6\\u3be7\\u3be8\\u3be9\\u3bea\\u3beb\\u3bec\\u3bed\\u3bee\\u3bef\\u3bf0\\u3bf1\\u3bf2\\u3bf3\\u3bf4\\u3bf5\\u3bf6\\u3bf7\\u3bf8\\u3bf9\\u3bfa\\u3bfb\\u3bfc\\u3bfd\\u3bfe\\u3bff\\u3c00\\u3c01\\u3c02\\u3c03\\u3c04\\u3c05\\u3c06\\u3c07\\u3c08\\u3c09\\u3c0a\\u3c0b\\u3c0c\\u3c0d\\u3c0e\\u3c0f\\u3c10\\u3c11\\u3c12\\u3c13\\u3c14\\u3c15\\u3c16\\u3c17\\u3c18\\u3c19\\u3c1a\\u3c1b\\u3c1c\\u3c1d\\u3c1e\\u3c1f\\u3c20\\u3c21\\u3c22\\u3c23\\u3c24\\u3c25\\u3c26\\u3c27\\u3c28\\u3c29\\u3c2a\\u3c2b\\u3c2c\\u3c2d\\u3c2e\\u3c2f\\u3c30\\u3c31\\u3c32\\u3c33\\u3c34\\u3c35\\u3c36\\u3c37\\u3c38\\u3c39\\u3c3a\\u3c3b\\u3c3c\\u3c3d\\u3c3e\\u3c3f\\u3c40\\u3c41\\u3c42\\u3c43\\u3c44\\u3c45\\u3c46\\u3c47\\u3c48\\u3c49\\u3c4a\\u3c4b\\u3c4c\\u3c4d\\u3c4e\\u3c4f\\u3c50\\u3c51\\u3c52\\u3c53\\u3c54\\u3c55\\u3c56\\u3c57\\u3c58\\u3c59\\u3c5a\\u3c5b\\u3c5c\\u3c5d\\u3c5e\\u3c5f\\u3c60\\u3c61\\u3c62\\u3c63\\u3c64\\u3c65\\u3c66\\u3c67\\u3c68\\u3c69\\u3c6a\\u3c6b\\u3c6c\\u3c6d\\u3c6e\\u3c6f\\u3c70\\u3c71\\u3c72\\u3c73\\u3c74\\u3c75\\u3c76\\u3c77\\u3c78\\u3c79\\u3c7a\\u3c7b\\u3c7c\\u3c7d\\u3c7e\\u3c7f\\u3c80\\u3c81\\u3c82\\u3c83\\u3c84\\u3c85\\u3c86\\u3c87\\u3c88\\u3c89\\u3c8a\\u3c8b\\u3c8c\\u3c8d\\u3c8e\\u3c8f\\u3c90\\u3c91\\u3c92\\u3c93\\u3c94\\u3c95\\u3c96\\u3c97\\u3c98\\u3c99\\u3c9a\\u3c9b\\u3c9c\\u3c9d\\u3c9e\\u3c9f\\u3ca0\\u3ca1\\u3ca2\\u3ca3\\u3ca4\\u3ca5\\u3ca6\\u3ca7\\u3ca8\\u3ca9\\u3caa\\u3cab\\u3cac\\u3cad\\u3cae\\u3caf\\u3cb0\\u3cb1\\u3cb2\\u3cb3\\u3cb4\\u3cb5\\u3cb6\\u3cb7\\u3cb8\\u3cb9\\u3cba\\u3cbb\\u3cbc\\u3cbd\\u3cbe\\u3cbf\\u3cc0\\u3cc1\\u3cc2\\u3cc3\\u3cc4\\u3cc5\\u3cc6\\u3cc7\\u3cc8\\u3cc9\\u3cca\\u3ccb\\u3ccc\\u3ccd\\u3cce\\u3ccf\\u3cd0\\u3cd1\\u3cd2\\u3cd3\\u3cd4\\u3cd5\\u3cd6\\u3cd7\\u3cd8\\u3cd9\\u3cda\\u3cdb\\u3cdc\\u3cdd\\u3cde\\u3cdf\\u3ce0\\u3ce1\\u3ce2\\u3ce3\\u3ce4\\u3ce5\\u3ce6\\u3ce7\\u3ce8\\u3ce9\\u3cea\\u3ceb\\u3cec\\u3ced\\u3cee\\u3cef\\u3cf0\\u3cf1\\u3cf2\\u3cf3\\u3cf4\\u3cf5\\u3cf6\\u3cf7\\u3cf8\\u3cf9\\u3cfa\\u3cfb\\u3cfc\\u3cfd\\u3cfe\\u3cff\\u3d00\\u3d01\\u3d02\\u3d03\\u3d04\\u3d05\\u3d06\\u3d07\\u3d08\\u3d09\\u3d0a\\u3d0b\\u3d0c\\u3d0d\\u3d0e\\u3d0f\\u3d10\\u3d11\\u3d12\\u3d13\\u3d14\\u3d15\\u3d16\\u3d17\\u3d18\\u3d19\\u3d1a\\u3d1b\\u3d1c\\u3d1d\\u3d1e\\u3d1f\\u3d20\\u3d21\\u3d22\\u3d23\\u3d24\\u3d25\\u3d26\\u3d27\\u3d28\\u3d29\\u3d2a\\u3d2b\\u3d2c\\u3d2d\\u3d2e\\u3d2f\\u3d30\\u3d31\\u3d32\\u3d33\\u3d34\\u3d35\\u3d36\\u3d37\\u3d38\\u3d39\\u3d3a\\u3d3b\\u3d3c\\u3d3d\\u3d3e\\u3d3f\\u3d40\\u3d41\\u3d42\\u3d43\\u3d44\\u3d45\\u3d46\\u3d47\\u3d48\\u3d49\\u3d4a\\u3d4b\\u3d4c\\u3d4d\\u3d4e\\u3d4f\\u3d50\\u3d51\\u3d52\\u3d53\\u3d54\\u3d55\\u3d56\\u3d57\\u3d58\\u3d59\\u3d5a\\u3d5b\\u3d5c\\u3d5d\\u3d5e\\u3d5f\\u3d60\\u3d61\\u3d62\\u3d63\\u3d64\\u3d65\\u3d66\\u3d67\\u3d68\\u3d69\\u3d6a\\u3d6b\\u3d6c\\u3d6d\\u3d6e\\u3d6f\\u3d70\\u3d71\\u3d72\\u3d73\\u3d74\\u3d75\\u3d76\\u3d77\\u3d78\\u3d79\\u3d7a\\u3d7b\\u3d7c\\u3d7d\\u3d7e\\u3d7f\\u3d80\\u3d81\\u3d82\\u3d83\\u3d84\\u3d85\\u3d86\\u3d87\\u3d88\\u3d89\\u3d8a\\u3d8b\\u3d8c\\u3d8d\\u3d8e\\u3d8f\\u3d90\\u3d91\\u3d92\\u3d93\\u3d94\\u3d95\\u3d96\\u3d97\\u3d98\\u3d99\\u3d9a\\u3d9b\\u3d9c\\u3d9d\\u3d9e\\u3d9f\\u3da0\\u3da1\\u3da2\\u3da3\\u3da4\\u3da5\\u3da6\\u3da7\\u3da8\\u3da9\\u3daa\\u3dab\\u3dac\\u3dad\\u3dae\\u3daf\\u3db0\\u3db1\\u3db2\\u3db3\\u3db4\\u3db5\\u3db6\\u3db7\\u3db8\\u3db9\\u3dba\\u3dbb\\u3dbc\\u3dbd\\u3dbe\\u3dbf\\u3dc0\\u3dc1\\u3dc2\\u3dc3\\u3dc4\\u3dc5\\u3dc6\\u3dc7\\u3dc8\\u3dc9\\u3dca\\u3dcb\\u3dcc\\u3dcd\\u3dce\\u3dcf\\u3dd0\\u3dd1\\u3dd2\\u3dd3\\u3dd4\\u3dd5\\u3dd6\\u3dd7\\u3dd8\\u3dd9\\u3dda\\u3ddb\\u3ddc\\u3ddd\\u3dde\\u3ddf\\u3de0\\u3de1\\u3de2\\u3de3\\u3de4\\u3de5\\u3de6\\u3de7\\u3de8\\u3de9\\u3dea\\u3deb\\u3dec\\u3ded\\u3dee\\u3def\\u3df0\\u3df1\\u3df2\\u3df3\\u3df4\\u3df5\\u3df6\\u3df7\\u3df8\\u3df9\\u3dfa\\u3dfb\\u3dfc\\u3dfd\\u3dfe\\u3dff\\u3e00\\u3e01\\u3e02\\u3e03\\u3e04\\u3e05\\u3e06\\u3e07\\u3e08\\u3e09\\u3e0a\\u3e0b\\u3e0c\\u3e0d\\u3e0e\\u3e0f\\u3e10\\u3e11\\u3e12\\u3e13\\u3e14\\u3e15\\u3e16\\u3e17\\u3e18\\u3e19\\u3e1a\\u3e1b\\u3e1c\\u3e1d\\u3e1e\\u3e1f\\u3e20\\u3e21\\u3e22\\u3e23\\u3e24\\u3e25\\u3e26\\u3e27\\u3e28\\u3e29\\u3e2a\\u3e2b\\u3e2c\\u3e2d\\u3e2e\\u3e2f\\u3e30\\u3e31\\u3e32\\u3e33\\u3e34\\u3e35\\u3e36\\u3e37\\u3e38\\u3e39\\u3e3a\\u3e3b\\u3e3c\\u3e3d\\u3e3e\\u3e3f\\u3e40\\u3e41\\u3e42\\u3e43\\u3e44\\u3e45\\u3e46\\u3e47\\u3e48\\u3e49\\u3e4a\\u3e4b\\u3e4c\\u3e4d\\u3e4e\\u3e4f\\u3e50\\u3e51\\u3e52\\u3e53\\u3e54\\u3e55\\u3e56\\u3e57\\u3e58\\u3e59\\u3e5a\\u3e5b\\u3e5c\\u3e5d\\u3e5e\\u3e5f\\u3e60\\u3e61\\u3e62\\u3e63\\u3e64\\u3e65\\u3e66\\u3e67\\u3e68\\u3e69\\u3e6a\\u3e6b\\u3e6c\\u3e6d\\u3e6e\\u3e6f\\u3e70\\u3e71\\u3e72\\u3e73\\u3e74\\u3e75\\u3e76\\u3e77\\u3e78\\u3e79\\u3e7a\\u3e7b\\u3e7c\\u3e7d\\u3e7e\\u3e7f\\u3e80\\u3e81\\u3e82\\u3e83\\u3e84\\u3e85\\u3e86\\u3e87\\u3e88\\u3e89\\u3e8a\\u3e8b\\u3e8c\\u3e8d\\u3e8e\\u3e8f\\u3e90\\u3e91\\u3e92\\u3e93\\u3e94\\u3e95\\u3e96\\u3e97\\u3e98\\u3e99\\u3e9a\\u3e9b\\u3e9c\\u3e9d\\u3e9e\\u3e9f\\u3ea0\\u3ea1\\u3ea2\\u3ea3\\u3ea4\\u3ea5\\u3ea6\\u3ea7\\u3ea8\\u3ea9\\u3eaa\\u3eab\\u3eac\\u3ead\\u3eae\\u3eaf\\u3eb0\\u3eb1\\u3eb2\\u3eb3\\u3eb4\\u3eb5\\u3eb6\\u3eb7\\u3eb8\\u3eb9\\u3eba\\u3ebb\\u3ebc\\u3ebd\\u3ebe\\u3ebf\\u3ec0\\u3ec1\\u3ec2\\u3ec3\\u3ec4\\u3ec5\\u3ec6\\u3ec7\\u3ec8\\u3ec9\\u3eca\\u3ecb\\u3ecc\\u3ecd\\u3ece\\u3ecf\\u3ed0\\u3ed1\\u3ed2\\u3ed3\\u3ed4\\u3ed5\\u3ed6\\u3ed7\\u3ed8\\u3ed9\\u3eda\\u3edb\\u3edc\\u3edd\\u3ede\\u3edf\\u3ee0\\u3ee1\\u3ee2\\u3ee3\\u3ee4\\u3ee5\\u3ee6\\u3ee7\\u3ee8\\u3ee9\\u3eea\\u3eeb\\u3eec\\u3eed\\u3eee\\u3eef\\u3ef0\\u3ef1\\u3ef2\\u3ef3\\u3ef4\\u3ef5\\u3ef6\\u3ef7\\u3ef8\\u3ef9\\u3efa\\u3efb\\u3efc\\u3efd\\u3efe\\u3eff\\u3f00\\u3f01\\u3f02\\u3f03\\u3f04\\u3f05\\u3f06\\u3f07\\u3f08\\u3f09\\u3f0a\\u3f0b\\u3f0c\\u3f0d\\u3f0e\\u3f0f\\u3f10\\u3f11\\u3f12\\u3f13\\u3f14\\u3f15\\u3f16\\u3f17\\u3f18\\u3f19\\u3f1a\\u3f1b\\u3f1c\\u3f1d\\u3f1e\\u3f1f\\u3f20\\u3f21\\u3f22\\u3f23\\u3f24\\u3f25\\u3f26\\u3f27\\u3f28\\u3f29\\u3f2a\\u3f2b\\u3f2c\\u3f2d\\u3f2e\\u3f2f\\u3f30\\u3f31\\u3f32\\u3f33\\u3f34\\u3f35\\u3f36\\u3f37\\u3f38\\u3f39\\u3f3a\\u3f3b\\u3f3c\\u3f3d\\u3f3e\\u3f3f\\u3f40\\u3f41\\u3f42\\u3f43\\u3f44\\u3f45\\u3f46\\u3f47\\u3f48\\u3f49\\u3f4a\\u3f4b\\u3f4c\\u3f4d\\u3f4e\\u3f4f\\u3f50\\u3f51\\u3f52\\u3f53\\u3f54\\u3f55\\u3f56\\u3f57\\u3f58\\u3f59\\u3f5a\\u3f5b\\u3f5c\\u3f5d\\u3f5e\\u3f5f\\u3f60\\u3f61\\u3f62\\u3f63\\u3f64\\u3f65\\u3f66\\u3f67\\u3f68\\u3f69\\u3f6a\\u3f6b\\u3f6c\\u3f6d\\u3f6e\\u3f6f\\u3f70\\u3f71\\u3f72\\u3f73\\u3f74\\u3f75\\u3f76\\u3f77\\u3f78\\u3f79\\u3f7a\\u3f7b\\u3f7c\\u3f7d\\u3f7e\\u3f7f\\u3f80\\u3f81\\u3f82\\u3f83\\u3f84\\u3f85\\u3f86\\u3f87\\u3f88\\u3f89\\u3f8a\\u3f8b\\u3f8c\\u3f8d\\u3f8e\\u3f8f\\u3f90\\u3f91\\u3f92\\u3f93\\u3f94\\u3f95\\u3f96\\u3f97\\u3f98\\u3f99\\u3f9a\\u3f9b\\u3f9c\\u3f9d\\u3f9e\\u3f9f\\u3fa0\\u3fa1\\u3fa2\\u3fa3\\u3fa4\\u3fa5\\u3fa6\\u3fa7\\u3fa8\\u3fa9\\u3faa\\u3fab\\u3fac\\u3fad\\u3fae\\u3faf\\u3fb0\\u3fb1\\u3fb2\\u3fb3\\u3fb4\\u3fb5\\u3fb6\\u3fb7\\u3fb8\\u3fb9\\u3fba\\u3fbb\\u3fbc\\u3fbd\\u3fbe\\u3fbf\\u3fc0\\u3fc1\\u3fc2\\u3fc3\\u3fc4\\u3fc5\\u3fc6\\u3fc7\\u3fc8\\u3fc9\\u3fca\\u3fcb\\u3fcc\\u3fcd\\u3fce\\u3fcf\\u3fd0\\u3fd1\\u3fd2\\u3fd3\\u3fd4\\u3fd5\\u3fd6\\u3fd7\\u3fd8\\u3fd9\\u3fda\\u3fdb\\u3fdc\\u3fdd\\u3fde\\u3fdf\\u3fe0\\u3fe1\\u3fe2\\u3fe3\\u3fe4\\u3fe5\\u3fe6\\u3fe7\\u3fe8\\u3fe9\\u3fea\\u3feb\\u3fec\\u3fed\\u3fee\\u3fef\\u3ff0\\u3ff1\\u3ff2\\u3ff3\\u3ff4\\u3ff5\\u3ff6\\u3ff7\\u3ff8\\u3ff9\\u3ffa\\u3ffb\\u3ffc\\u3ffd\\u3ffe\\u3fff\\u4000\\u4001\\u4002\\u4003\\u4004\\u4005\\u4006\\u4007\\u4008\\u4009\\u400a\\u400b\\u400c\\u400d\\u400e\\u400f\\u4010\\u4011\\u4012\\u4013\\u4014\\u4015\\u4016\\u4017\\u4018\\u4019\\u401a\\u401b\\u401c\\u401d\\u401e\\u401f\\u4020\\u4021\\u4022\\u4023\\u4024\\u4025\\u4026\\u4027\\u4028\\u4029\\u402a\\u402b\\u402c\\u402d\\u402e\\u402f\\u4030\\u4031\\u4032\\u4033\\u4034\\u4035\\u4036\\u4037\\u4038\\u4039\\u403a\\u403b\\u403c\\u403d\\u403e\\u403f\\u4040\\u4041\\u4042\\u4043\\u4044\\u4045\\u4046\\u4047\\u4048\\u4049\\u404a\\u404b\\u404c\\u404d\\u404e\\u404f\\u4050\\u4051\\u4052\\u4053\\u4054\\u4055\\u4056\\u4057\\u4058\\u4059\\u405a\\u405b\\u405c\\u405d\\u405e\\u405f\\u4060\\u4061\\u4062\\u4063\\u4064\\u4065\\u4066\\u4067\\u4068\\u4069\\u406a\\u406b\\u406c\\u406d\\u406e\\u406f\\u4070\\u4071\\u4072\\u4073\\u4074\\u4075\\u4076\\u4077\\u4078\\u4079\\u407a\\u407b\\u407c\\u407d\\u407e\\u407f\\u4080\\u4081\\u4082\\u4083\\u4084\\u4085\\u4086\\u4087\\u4088\\u4089\\u408a\\u408b\\u408c\\u408d\\u408e\\u408f\\u4090\\u4091\\u4092\\u4093\\u4094\\u4095\\u4096\\u4097\\u4098\\u4099\\u409a\\u409b\\u409c\\u409d\\u409e\\u409f\\u40a0\\u40a1\\u40a2\\u40a3\\u40a4\\u40a5\\u40a6\\u40a7\\u40a8\\u40a9\\u40aa\\u40ab\\u40ac\\u40ad\\u40ae\\u40af\\u40b0\\u40b1\\u40b2\\u40b3\\u40b4\\u40b5\\u40b6\\u40b7\\u40b8\\u40b9\\u40ba\\u40bb\\u40bc\\u40bd\\u40be\\u40bf\\u40c0\\u40c1\\u40c2\\u40c3\\u40c4\\u40c5\\u40c6\\u40c7\\u40c8\\u40c9\\u40ca\\u40cb\\u40cc\\u40cd\\u40ce\\u40cf\\u40d0\\u40d1\\u40d2\\u40d3\\u40d4\\u40d5\\u40d6\\u40d7\\u40d8\\u40d9\\u40da\\u40db\\u40dc\\u40dd\\u40de\\u40df\\u40e0\\u40e1\\u40e2\\u40e3\\u40e4\\u40e5\\u40e6\\u40e7\\u40e8\\u40e9\\u40ea\\u40eb\\u40ec\\u40ed\\u40ee\\u40ef\\u40f0\\u40f1\\u40f2\\u40f3\\u40f4\\u40f5\\u40f6\\u40f7\\u40f8\\u40f9\\u40fa\\u40fb\\u40fc\\u40fd\\u40fe\\u40ff\\u4100\\u4101\\u4102\\u4103\\u4104\\u4105\\u4106\\u4107\\u4108\\u4109\\u410a\\u410b\\u410c\\u410d\\u410e\\u410f\\u4110\\u4111\\u4112\\u4113\\u4114\\u4115\\u4116\\u4117\\u4118\\u4119\\u411a\\u411b\\u411c\\u411d\\u411e\\u411f\\u4120\\u4121\\u4122\\u4123\\u4124\\u4125\\u4126\\u4127\\u4128\\u4129\\u412a\\u412b\\u412c\\u412d\\u412e\\u412f\\u4130\\u4131\\u4132\\u4133\\u4134\\u4135\\u4136\\u4137\\u4138\\u4139\\u413a\\u413b\\u413c\\u413d\\u413e\\u413f\\u4140\\u4141\\u4142\\u4143\\u4144\\u4145\\u4146\\u4147\\u4148\\u4149\\u414a\\u414b\\u414c\\u414d\\u414e\\u414f\\u4150\\u4151\\u4152\\u4153\\u4154\\u4155\\u4156\\u4157\\u4158\\u4159\\u415a\\u415b\\u415c\\u415d\\u415e\\u415f\\u4160\\u4161\\u4162\\u4163\\u4164\\u4165\\u4166\\u4167\\u4168\\u4169\\u416a\\u416b\\u416c\\u416d\\u416e\\u416f\\u4170\\u4171\\u4172\\u4173\\u4174\\u4175\\u4176\\u4177\\u4178\\u4179\\u417a\\u417b\\u417c\\u417d\\u417e\\u417f\\u4180\\u4181\\u4182\\u4183\\u4184\\u4185\\u4186\\u4187\\u4188\\u4189\\u418a\\u418b\\u418c\\u418d\\u418e\\u418f\\u4190\\u4191\\u4192\\u4193\\u4194\\u4195\\u4196\\u4197\\u4198\\u4199\\u419a\\u419b\\u419c\\u419d\\u419e\\u419f\\u41a0\\u41a1\\u41a2\\u41a3\\u41a4\\u41a5\\u41a6\\u41a7\\u41a8\\u41a9\\u41aa\\u41ab\\u41ac\\u41ad\\u41ae\\u41af\\u41b0\\u41b1\\u41b2\\u41b3\\u41b4\\u41b5\\u41b6\\u41b7\\u41b8\\u41b9\\u41ba\\u41bb\\u41bc\\u41bd\\u41be\\u41bf\\u41c0\\u41c1\\u41c2\\u41c3\\u41c4\\u41c5\\u41c6\\u41c7\\u41c8\\u41c9\\u41ca\\u41cb\\u41cc\\u41cd\\u41ce\\u41cf\\u41d0\\u41d1\\u41d2\\u41d3\\u41d4\\u41d5\\u41d6\\u41d7\\u41d8\\u41d9\\u41da\\u41db\\u41dc\\u41dd\\u41de\\u41df\\u41e0\\u41e1\\u41e2\\u41e3\\u41e4\\u41e5\\u41e6\\u41e7\\u41e8\\u41e9\\u41ea\\u41eb\\u41ec\\u41ed\\u41ee\\u41ef\\u41f0\\u41f1\\u41f2\\u41f3\\u41f4\\u41f5\\u41f6\\u41f7\\u41f8\\u41f9\\u41fa\\u41fb\\u41fc\\u41fd\\u41fe\\u41ff\\u4200\\u4201\\u4202\\u4203\\u4204\\u4205\\u4206\\u4207\\u4208\\u4209\\u420a\\u420b\\u420c\\u420d\\u420e\\u420f\\u4210\\u4211\\u4212\\u4213\\u4214\\u4215\\u4216\\u4217\\u4218\\u4219\\u421a\\u421b\\u421c\\u421d\\u421e\\u421f\\u4220\\u4221\\u4222\\u4223\\u4224\\u4225\\u4226\\u4227\\u4228\\u4229\\u422a\\u422b\\u422c\\u422d\\u422e\\u422f\\u4230\\u4231\\u4232\\u4233\\u4234\\u4235\\u4236\\u4237\\u4238\\u4239\\u423a\\u423b\\u423c\\u423d\\u423e\\u423f\\u4240\\u4241\\u4242\\u4243\\u4244\\u4245\\u4246\\u4247\\u4248\\u4249\\u424a\\u424b\\u424c\\u424d\\u424e\\u424f\\u4250\\u4251\\u4252\\u4253\\u4254\\u4255\\u4256\\u4257\\u4258\\u4259\\u425a\\u425b\\u425c\\u425d\\u425e\\u425f\\u4260\\u4261\\u4262\\u4263\\u4264\\u4265\\u4266\\u4267\\u4268\\u4269\\u426a\\u426b\\u426c\\u426d\\u426e\\u426f\\u4270\\u4271\\u4272\\u4273\\u4274\\u4275\\u4276\\u4277\\u4278\\u4279\\u427a\\u427b\\u427c\\u427d\\u427e\\u427f\\u4280\\u4281\\u4282\\u4283\\u4284\\u4285\\u4286\\u4287\\u4288\\u4289\\u428a\\u428b\\u428c\\u428d\\u428e\\u428f\\u4290\\u4291\\u4292\\u4293\\u4294\\u4295\\u4296\\u4297\\u4298\\u4299\\u429a\\u429b\\u429c\\u429d\\u429e\\u429f\\u42a0\\u42a1\\u42a2\\u42a3\\u42a4\\u42a5\\u42a6\\u42a7\\u42a8\\u42a9\\u42aa\\u42ab\\u42ac\\u42ad\\u42ae\\u42af\\u42b0\\u42b1\\u42b2\\u42b3\\u42b4\\u42b5\\u42b6\\u42b7\\u42b8\\u42b9\\u42ba\\u42bb\\u42bc\\u42bd\\u42be\\u42bf\\u42c0\\u42c1\\u42c2\\u42c3\\u42c4\\u42c5\\u42c6\\u42c7\\u42c8\\u42c9\\u42ca\\u42cb\\u42cc\\u42cd\\u42ce\\u42cf\\u42d0\\u42d1\\u42d2\\u42d3\\u42d4\\u42d5\\u42d6\\u42d7\\u42d8\\u42d9\\u42da\\u42db\\u42dc\\u42dd\\u42de\\u42df\\u42e0\\u42e1\\u42e2\\u42e3\\u42e4\\u42e5\\u42e6\\u42e7\\u42e8\\u42e9\\u42ea\\u42eb\\u42ec\\u42ed\\u42ee\\u42ef\\u42f0\\u42f1\\u42f2\\u42f3\\u42f4\\u42f5\\u42f6\\u42f7\\u42f8\\u42f9\\u42fa\\u42fb\\u42fc\\u42fd\\u42fe\\u42ff\\u4300\\u4301\\u4302\\u4303\\u4304\\u4305\\u4306\\u4307\\u4308\\u4309\\u430a\\u430b\\u430c\\u430d\\u430e\\u430f\\u4310\\u4311\\u4312\\u4313\\u4314\\u4315\\u4316\\u4317\\u4318\\u4319\\u431a\\u431b\\u431c\\u431d\\u431e\\u431f\\u4320\\u4321\\u4322\\u4323\\u4324\\u4325\\u4326\\u4327\\u4328\\u4329\\u432a\\u432b\\u432c\\u432d\\u432e\\u432f\\u4330\\u4331\\u4332\\u4333\\u4334\\u4335\\u4336\\u4337\\u4338\\u4339\\u433a\\u433b\\u433c\\u433d\\u433e\\u433f\\u4340\\u4341\\u4342\\u4343\\u4344\\u4345\\u4346\\u4347\\u4348\\u4349\\u434a\\u434b\\u434c\\u434d\\u434e\\u434f\\u4350\\u4351\\u4352\\u4353\\u4354\\u4355\\u4356\\u4357\\u4358\\u4359\\u435a\\u435b\\u435c\\u435d\\u435e\\u435f\\u4360\\u4361\\u4362\\u4363\\u4364\\u4365\\u4366\\u4367\\u4368\\u4369\\u436a\\u436b\\u436c\\u436d\\u436e\\u436f\\u4370\\u4371\\u4372\\u4373\\u4374\\u4375\\u4376\\u4377\\u4378\\u4379\\u437a\\u437b\\u437c\\u437d\\u437e\\u437f\\u4380\\u4381\\u4382\\u4383\\u4384\\u4385\\u4386\\u4387\\u4388\\u4389\\u438a\\u438b\\u438c\\u438d\\u438e\\u438f\\u4390\\u4391\\u4392\\u4393\\u4394\\u4395\\u4396\\u4397\\u4398\\u4399\\u439a\\u439b\\u439c\\u439d\\u439e\\u439f\\u43a0\\u43a1\\u43a2\\u43a3\\u43a4\\u43a5\\u43a6\\u43a7\\u43a8\\u43a9\\u43aa\\u43ab\\u43ac\\u43ad\\u43ae\\u43af\\u43b0\\u43b1\\u43b2\\u43b3\\u43b4\\u43b5\\u43b6\\u43b7\\u43b8\\u43b9\\u43ba\\u43bb\\u43bc\\u43bd\\u43be\\u43bf\\u43c0\\u43c1\\u43c2\\u43c3\\u43c4\\u43c5\\u43c6\\u43c7\\u43c8\\u43c9\\u43ca\\u43cb\\u43cc\\u43cd\\u43ce\\u43cf\\u43d0\\u43d1\\u43d2\\u43d3\\u43d4\\u43d5\\u43d6\\u43d7\\u43d8\\u43d9\\u43da\\u43db\\u43dc\\u43dd\\u43de\\u43df\\u43e0\\u43e1\\u43e2\\u43e3\\u43e4\\u43e5\\u43e6\\u43e7\\u43e8\\u43e9\\u43ea\\u43eb\\u43ec\\u43ed\\u43ee\\u43ef\\u43f0\\u43f1\\u43f2\\u43f3\\u43f4\\u43f5\\u43f6\\u43f7\\u43f8\\u43f9\\u43fa\\u43fb\\u43fc\\u43fd\\u43fe\\u43ff\\u4400\\u4401\\u4402\\u4403\\u4404\\u4405\\u4406\\u4407\\u4408\\u4409\\u440a\\u440b\\u440c\\u440d\\u440e\\u440f\\u4410\\u4411\\u4412\\u4413\\u4414\\u4415\\u4416\\u4417\\u4418\\u4419\\u441a\\u441b\\u441c\\u441d\\u441e\\u441f\\u4420\\u4421\\u4422\\u4423\\u4424\\u4425\\u4426\\u4427\\u4428\\u4429\\u442a\\u442b\\u442c\\u442d\\u442e\\u442f\\u4430\\u4431\\u4432\\u4433\\u4434\\u4435\\u4436\\u4437\\u4438\\u4439\\u443a\\u443b\\u443c\\u443d\\u443e\\u443f\\u4440\\u4441\\u4442\\u4443\\u4444\\u4445\\u4446\\u4447\\u4448\\u4449\\u444a\\u444b\\u444c\\u444d\\u444e\\u444f\\u4450\\u4451\\u4452\\u4453\\u4454\\u4455\\u4456\\u4457\\u4458\\u4459\\u445a\\u445b\\u445c\\u445d\\u445e\\u445f\\u4460\\u4461\\u4462\\u4463\\u4464\\u4465\\u4466\\u4467\\u4468\\u4469\\u446a\\u446b\\u446c\\u446d\\u446e\\u446f\\u4470\\u4471\\u4472\\u4473\\u4474\\u4475\\u4476\\u4477\\u4478\\u4479\\u447a\\u447b\\u447c\\u447d\\u447e\\u447f\\u4480\\u4481\\u4482\\u4483\\u4484\\u4485\\u4486\\u4487\\u4488\\u4489\\u448a\\u448b\\u448c\\u448d\\u448e\\u448f\\u4490\\u4491\\u4492\\u4493\\u4494\\u4495\\u4496\\u4497\\u4498\\u4499\\u449a\\u449b\\u449c\\u449d\\u449e\\u449f\\u44a0\\u44a1\\u44a2\\u44a3\\u44a4\\u44a5\\u44a6\\u44a7\\u44a8\\u44a9\\u44aa\\u44ab\\u44ac\\u44ad\\u44ae\\u44af\\u44b0\\u44b1\\u44b2\\u44b3\\u44b4\\u44b5\\u44b6\\u44b7\\u44b8\\u44b9\\u44ba\\u44bb\\u44bc\\u44bd\\u44be\\u44bf\\u44c0\\u44c1\\u44c2\\u44c3\\u44c4\\u44c5\\u44c6\\u44c7\\u44c8\\u44c9\\u44ca\\u44cb\\u44cc\\u44cd\\u44ce\\u44cf\\u44d0\\u44d1\\u44d2\\u44d3\\u44d4\\u44d5\\u44d6\\u44d7\\u44d8\\u44d9\\u44da\\u44db\\u44dc\\u44dd\\u44de\\u44df\\u44e0\\u44e1\\u44e2\\u44e3\\u44e4\\u44e5\\u44e6\\u44e7\\u44e8\\u44e9\\u44ea\\u44eb\\u44ec\\u44ed\\u44ee\\u44ef\\u44f0\\u44f1\\u44f2\\u44f3\\u44f4\\u44f5\\u44f6\\u44f7\\u44f8\\u44f9\\u44fa\\u44fb\\u44fc\\u44fd\\u44fe\\u44ff\\u4500\\u4501\\u4502\\u4503\\u4504\\u4505\\u4506\\u4507\\u4508\\u4509\\u450a\\u450b\\u450c\\u450d\\u450e\\u450f\\u4510\\u4511\\u4512\\u4513\\u4514\\u4515\\u4516\\u4517\\u4518\\u4519\\u451a\\u451b\\u451c\\u451d\\u451e\\u451f\\u4520\\u4521\\u4522\\u4523\\u4524\\u4525\\u4526\\u4527\\u4528\\u4529\\u452a\\u452b\\u452c\\u452d\\u452e\\u452f\\u4530\\u4531\\u4532\\u4533\\u4534\\u4535\\u4536\\u4537\\u4538\\u4539\\u453a\\u453b\\u453c\\u453d\\u453e\\u453f\\u4540\\u4541\\u4542\\u4543\\u4544\\u4545\\u4546\\u4547\\u4548\\u4549\\u454a\\u454b\\u454c\\u454d\\u454e\\u454f\\u4550\\u4551\\u4552\\u4553\\u4554\\u4555\\u4556\\u4557\\u4558\\u4559\\u455a\\u455b\\u455c\\u455d\\u455e\\u455f\\u4560\\u4561\\u4562\\u4563\\u4564\\u4565\\u4566\\u4567\\u4568\\u4569\\u456a\\u456b\\u456c\\u456d\\u456e\\u456f\\u4570\\u4571\\u4572\\u4573\\u4574\\u4575\\u4576\\u4577\\u4578\\u4579\\u457a\\u457b\\u457c\\u457d\\u457e\\u457f\\u4580\\u4581\\u4582\\u4583\\u4584\\u4585\\u4586\\u4587\\u4588\\u4589\\u458a\\u458b\\u458c\\u458d\\u458e\\u458f\\u4590\\u4591\\u4592\\u4593\\u4594\\u4595\\u4596\\u4597\\u4598\\u4599\\u459a\\u459b\\u459c\\u459d\\u459e\\u459f\\u45a0\\u45a1\\u45a2\\u45a3\\u45a4\\u45a5\\u45a6\\u45a7\\u45a8\\u45a9\\u45aa\\u45ab\\u45ac\\u45ad\\u45ae\\u45af\\u45b0\\u45b1\\u45b2\\u45b3\\u45b4\\u45b5\\u45b6\\u45b7\\u45b8\\u45b9\\u45ba\\u45bb\\u45bc\\u45bd\\u45be\\u45bf\\u45c0\\u45c1\\u45c2\\u45c3\\u45c4\\u45c5\\u45c6\\u45c7\\u45c8\\u45c9\\u45ca\\u45cb\\u45cc\\u45cd\\u45ce\\u45cf\\u45d0\\u45d1\\u45d2\\u45d3\\u45d4\\u45d5\\u45d6\\u45d7\\u45d8\\u45d9\\u45da\\u45db\\u45dc\\u45dd\\u45de\\u45df\\u45e0\\u45e1\\u45e2\\u45e3\\u45e4\\u45e5\\u45e6\\u45e7\\u45e8\\u45e9\\u45ea\\u45eb\\u45ec\\u45ed\\u45ee\\u45ef\\u45f0\\u45f1\\u45f2\\u45f3\\u45f4\\u45f5\\u45f6\\u45f7\\u45f8\\u45f9\\u45fa\\u45fb\\u45fc\\u45fd\\u45fe\\u45ff\\u4600\\u4601\\u4602\\u4603\\u4604\\u4605\\u4606\\u4607\\u4608\\u4609\\u460a\\u460b\\u460c\\u460d\\u460e\\u460f\\u4610\\u4611\\u4612\\u4613\\u4614\\u4615\\u4616\\u4617\\u4618\\u4619\\u461a\\u461b\\u461c\\u461d\\u461e\\u461f\\u4620\\u4621\\u4622\\u4623\\u4624\\u4625\\u4626\\u4627\\u4628\\u4629\\u462a\\u462b\\u462c\\u462d\\u462e\\u462f\\u4630\\u4631\\u4632\\u4633\\u4634\\u4635\\u4636\\u4637\\u4638\\u4639\\u463a\\u463b\\u463c\\u463d\\u463e\\u463f\\u4640\\u4641\\u4642\\u4643\\u4644\\u4645\\u4646\\u4647\\u4648\\u4649\\u464a\\u464b\\u464c\\u464d\\u464e\\u464f\\u4650\\u4651\\u4652\\u4653\\u4654\\u4655\\u4656\\u4657\\u4658\\u4659\\u465a\\u465b\\u465c\\u465d\\u465e\\u465f\\u4660\\u4661\\u4662\\u4663\\u4664\\u4665\\u4666\\u4667\\u4668\\u4669\\u466a\\u466b\\u466c\\u466d\\u466e\\u466f\\u4670\\u4671\\u4672\\u4673\\u4674\\u4675\\u4676\\u4677\\u4678\\u4679\\u467a\\u467b\\u467c\\u467d\\u467e\\u467f\\u4680\\u4681\\u4682\\u4683\\u4684\\u4685\\u4686\\u4687\\u4688\\u4689\\u468a\\u468b\\u468c\\u468d\\u468e\\u468f\\u4690\\u4691\\u4692\\u4693\\u4694\\u4695\\u4696\\u4697\\u4698\\u4699\\u469a\\u469b\\u469c\\u469d\\u469e\\u469f\\u46a0\\u46a1\\u46a2\\u46a3\\u46a4\\u46a5\\u46a6\\u46a7\\u46a8\\u46a9\\u46aa\\u46ab\\u46ac\\u46ad\\u46ae\\u46af\\u46b0\\u46b1\\u46b2\\u46b3\\u46b4\\u46b5\\u46b6\\u46b7\\u46b8\\u46b9\\u46ba\\u46bb\\u46bc\\u46bd\\u46be\\u46bf\\u46c0\\u46c1\\u46c2\\u46c3\\u46c4\\u46c5\\u46c6\\u46c7\\u46c8\\u46c9\\u46ca\\u46cb\\u46cc\\u46cd\\u46ce\\u46cf\\u46d0\\u46d1\\u46d2\\u46d3\\u46d4\\u46d5\\u46d6\\u46d7\\u46d8\\u46d9\\u46da\\u46db\\u46dc\\u46dd\\u46de\\u46df\\u46e0\\u46e1\\u46e2\\u46e3\\u46e4\\u46e5\\u46e6\\u46e7\\u46e8\\u46e9\\u46ea\\u46eb\\u46ec\\u46ed\\u46ee\\u46ef\\u46f0\\u46f1\\u46f2\\u46f3\\u46f4\\u46f5\\u46f6\\u46f7\\u46f8\\u46f9\\u46fa\\u46fb\\u46fc\\u46fd\\u46fe\\u46ff\\u4700\\u4701\\u4702\\u4703\\u4704\\u4705\\u4706\\u4707\\u4708\\u4709\\u470a\\u470b\\u470c\\u470d\\u470e\\u470f\\u4710\\u4711\\u4712\\u4713\\u4714\\u4715\\u4716\\u4717\\u4718\\u4719\\u471a\\u471b\\u471c\\u471d\\u471e\\u471f\\u4720\\u4721\\u4722\\u4723\\u4724\\u4725\\u4726\\u4727\\u4728\\u4729\\u472a\\u472b\\u472c\\u472d\\u472e\\u472f\\u4730\\u4731\\u4732\\u4733\\u4734\\u4735\\u4736\\u4737\\u4738\\u4739\\u473a\\u473b\\u473c\\u473d\\u473e\\u473f\\u4740\\u4741\\u4742\\u4743\\u4744\\u4745\\u4746\\u4747\\u4748\\u4749\\u474a\\u474b\\u474c\\u474d\\u474e\\u474f\\u4750\\u4751\\u4752\\u4753\\u4754\\u4755\\u4756\\u4757\\u4758\\u4759\\u475a\\u475b\\u475c\\u475d\\u475e\\u475f\\u4760\\u4761\\u4762\\u4763\\u4764\\u4765\\u4766\\u4767\\u4768\\u4769\\u476a\\u476b\\u476c\\u476d\\u476e\\u476f\\u4770\\u4771\\u4772\\u4773\\u4774\\u4775\\u4776\\u4777\\u4778\\u4779\\u477a\\u477b\\u477c\\u477d\\u477e\\u477f\\u4780\\u4781\\u4782\\u4783\\u4784\\u4785\\u4786\\u4787\\u4788\\u4789\\u478a\\u478b\\u478c\\u478d\\u478e\\u478f\\u4790\\u4791\\u4792\\u4793\\u4794\\u4795\\u4796\\u4797\\u4798\\u4799\\u479a\\u479b\\u479c\\u479d\\u479e\\u479f\\u47a0\\u47a1\\u47a2\\u47a3\\u47a4\\u47a5\\u47a6\\u47a7\\u47a8\\u47a9\\u47aa\\u47ab\\u47ac\\u47ad\\u47ae\\u47af\\u47b0\\u47b1\\u47b2\\u47b3\\u47b4\\u47b5\\u47b6\\u47b7\\u47b8\\u47b9\\u47ba\\u47bb\\u47bc\\u47bd\\u47be\\u47bf\\u47c0\\u47c1\\u47c2\\u47c3\\u47c4\\u47c5\\u47c6\\u47c7\\u47c8\\u47c9\\u47ca\\u47cb\\u47cc\\u47cd\\u47ce\\u47cf\\u47d0\\u47d1\\u47d2\\u47d3\\u47d4\\u47d5\\u47d6\\u47d7\\u47d8\\u47d9\\u47da\\u47db\\u47dc\\u47dd\\u47de\\u47df\\u47e0\\u47e1\\u47e2\\u47e3\\u47e4\\u47e5\\u47e6\\u47e7\\u47e8\\u47e9\\u47ea\\u47eb\\u47ec\\u47ed\\u47ee\\u47ef\\u47f0\\u47f1\\u47f2\\u47f3\\u47f4\\u47f5\\u47f6\\u47f7\\u47f8\\u47f9\\u47fa\\u47fb\\u47fc\\u47fd\\u47fe\\u47ff\\u4800\\u4801\\u4802\\u4803\\u4804\\u4805\\u4806\\u4807\\u4808\\u4809\\u480a\\u480b\\u480c\\u480d\\u480e\\u480f\\u4810\\u4811\\u4812\\u4813\\u4814\\u4815\\u4816\\u4817\\u4818\\u4819\\u481a\\u481b\\u481c\\u481d\\u481e\\u481f\\u4820\\u4821\\u4822\\u4823\\u4824\\u4825\\u4826\\u4827\\u4828\\u4829\\u482a\\u482b\\u482c\\u482d\\u482e\\u482f\\u4830\\u4831\\u4832\\u4833\\u4834\\u4835\\u4836\\u4837\\u4838\\u4839\\u483a\\u483b\\u483c\\u483d\\u483e\\u483f\\u4840\\u4841\\u4842\\u4843\\u4844\\u4845\\u4846\\u4847\\u4848\\u4849\\u484a\\u484b\\u484c\\u484d\\u484e\\u484f\\u4850\\u4851\\u4852\\u4853\\u4854\\u4855\\u4856\\u4857\\u4858\\u4859\\u485a\\u485b\\u485c\\u485d\\u485e\\u485f\\u4860\\u4861\\u4862\\u4863\\u4864\\u4865\\u4866\\u4867\\u4868\\u4869\\u486a\\u486b\\u486c\\u486d\\u486e\\u486f\\u4870\\u4871\\u4872\\u4873\\u4874\\u4875\\u4876\\u4877\\u4878\\u4879\\u487a\\u487b\\u487c\\u487d\\u487e\\u487f\\u4880\\u4881\\u4882\\u4883\\u4884\\u4885\\u4886\\u4887\\u4888\\u4889\\u488a\\u488b\\u488c\\u488d\\u488e\\u488f\\u4890\\u4891\\u4892\\u4893\\u4894\\u4895\\u4896\\u4897\\u4898\\u4899\\u489a\\u489b\\u489c\\u489d\\u489e\\u489f\\u48a0\\u48a1\\u48a2\\u48a3\\u48a4\\u48a5\\u48a6\\u48a7\\u48a8\\u48a9\\u48aa\\u48ab\\u48ac\\u48ad\\u48ae\\u48af\\u48b0\\u48b1\\u48b2\\u48b3\\u48b4\\u48b5\\u48b6\\u48b7\\u48b8\\u48b9\\u48ba\\u48bb\\u48bc\\u48bd\\u48be\\u48bf\\u48c0\\u48c1\\u48c2\\u48c3\\u48c4\\u48c5\\u48c6\\u48c7\\u48c8\\u48c9\\u48ca\\u48cb\\u48cc\\u48cd\\u48ce\\u48cf\\u48d0\\u48d1\\u48d2\\u48d3\\u48d4\\u48d5\\u48d6\\u48d7\\u48d8\\u48d9\\u48da\\u48db\\u48dc\\u48dd\\u48de\\u48df\\u48e0\\u48e1\\u48e2\\u48e3\\u48e4\\u48e5\\u48e6\\u48e7\\u48e8\\u48e9\\u48ea\\u48eb\\u48ec\\u48ed\\u48ee\\u48ef\\u48f0\\u48f1\\u48f2\\u48f3\\u48f4\\u48f5\\u48f6\\u48f7\\u48f8\\u48f9\\u48fa\\u48fb\\u48fc\\u48fd\\u48fe\\u48ff\\u4900\\u4901\\u4902\\u4903\\u4904\\u4905\\u4906\\u4907\\u4908\\u4909\\u490a\\u490b\\u490c\\u490d\\u490e\\u490f\\u4910\\u4911\\u4912\\u4913\\u4914\\u4915\\u4916\\u4917\\u4918\\u4919\\u491a\\u491b\\u491c\\u491d\\u491e\\u491f\\u4920\\u4921\\u4922\\u4923\\u4924\\u4925\\u4926\\u4927\\u4928\\u4929\\u492a\\u492b\\u492c\\u492d\\u492e\\u492f\\u4930\\u4931\\u4932\\u4933\\u4934\\u4935\\u4936\\u4937\\u4938\\u4939\\u493a\\u493b\\u493c\\u493d\\u493e\\u493f\\u4940\\u4941\\u4942\\u4943\\u4944\\u4945\\u4946\\u4947\\u4948\\u4949\\u494a\\u494b\\u494c\\u494d\\u494e\\u494f\\u4950\\u4951\\u4952\\u4953\\u4954\\u4955\\u4956\\u4957\\u4958\\u4959\\u495a\\u495b\\u495c\\u495d\\u495e\\u495f\\u4960\\u4961\\u4962\\u4963\\u4964\\u4965\\u4966\\u4967\\u4968\\u4969\\u496a\\u496b\\u496c\\u496d\\u496e\\u496f\\u4970\\u4971\\u4972\\u4973\\u4974\\u4975\\u4976\\u4977\\u4978\\u4979\\u497a\\u497b\\u497c\\u497d\\u497e\\u497f\\u4980\\u4981\\u4982\\u4983\\u4984\\u4985\\u4986\\u4987\\u4988\\u4989\\u498a\\u498b\\u498c\\u498d\\u498e\\u498f\\u4990\\u4991\\u4992\\u4993\\u4994\\u4995\\u4996\\u4997\\u4998\\u4999\\u499a\\u499b\\u499c\\u499d\\u499e\\u499f\\u49a0\\u49a1\\u49a2\\u49a3\\u49a4\\u49a5\\u49a6\\u49a7\\u49a8\\u49a9\\u49aa\\u49ab\\u49ac\\u49ad\\u49ae\\u49af\\u49b0\\u49b1\\u49b2\\u49b3\\u49b4\\u49b5\\u49b6\\u49b7\\u49b8\\u49b9\\u49ba\\u49bb\\u49bc\\u49bd\\u49be\\u49bf\\u49c0\\u49c1\\u49c2\\u49c3\\u49c4\\u49c5\\u49c6\\u49c7\\u49c8\\u49c9\\u49ca\\u49cb\\u49cc\\u49cd\\u49ce\\u49cf\\u49d0\\u49d1\\u49d2\\u49d3\\u49d4\\u49d5\\u49d6\\u49d7\\u49d8\\u49d9\\u49da\\u49db\\u49dc\\u49dd\\u49de\\u49df\\u49e0\\u49e1\\u49e2\\u49e3\\u49e4\\u49e5\\u49e6\\u49e7\\u49e8\\u49e9\\u49ea\\u49eb\\u49ec\\u49ed\\u49ee\\u49ef\\u49f0\\u49f1\\u49f2\\u49f3\\u49f4\\u49f5\\u49f6\\u49f7\\u49f8\\u49f9\\u49fa\\u49fb\\u49fc\\u49fd\\u49fe\\u49ff\\u4a00\\u4a01\\u4a02\\u4a03\\u4a04\\u4a05\\u4a06\\u4a07\\u4a08\\u4a09\\u4a0a\\u4a0b\\u4a0c\\u4a0d\\u4a0e\\u4a0f\\u4a10\\u4a11\\u4a12\\u4a13\\u4a14\\u4a15\\u4a16\\u4a17\\u4a18\\u4a19\\u4a1a\\u4a1b\\u4a1c\\u4a1d\\u4a1e\\u4a1f\\u4a20\\u4a21\\u4a22\\u4a23\\u4a24\\u4a25\\u4a26\\u4a27\\u4a28\\u4a29\\u4a2a\\u4a2b\\u4a2c\\u4a2d\\u4a2e\\u4a2f\\u4a30\\u4a31\\u4a32\\u4a33\\u4a34\\u4a35\\u4a36\\u4a37\\u4a38\\u4a39\\u4a3a\\u4a3b\\u4a3c\\u4a3d\\u4a3e\\u4a3f\\u4a40\\u4a41\\u4a42\\u4a43\\u4a44\\u4a45\\u4a46\\u4a47\\u4a48\\u4a49\\u4a4a\\u4a4b\\u4a4c\\u4a4d\\u4a4e\\u4a4f\\u4a50\\u4a51\\u4a52\\u4a53\\u4a54\\u4a55\\u4a56\\u4a57\\u4a58\\u4a59\\u4a5a\\u4a5b\\u4a5c\\u4a5d\\u4a5e\\u4a5f\\u4a60\\u4a61\\u4a62\\u4a63\\u4a64\\u4a65\\u4a66\\u4a67\\u4a68\\u4a69\\u4a6a\\u4a6b\\u4a6c\\u4a6d\\u4a6e\\u4a6f\\u4a70\\u4a71\\u4a72\\u4a73\\u4a74\\u4a75\\u4a76\\u4a77\\u4a78\\u4a79\\u4a7a\\u4a7b\\u4a7c\\u4a7d\\u4a7e\\u4a7f\\u4a80\\u4a81\\u4a82\\u4a83\\u4a84\\u4a85\\u4a86\\u4a87\\u4a88\\u4a89\\u4a8a\\u4a8b\\u4a8c\\u4a8d\\u4a8e\\u4a8f\\u4a90\\u4a91\\u4a92\\u4a93\\u4a94\\u4a95\\u4a96\\u4a97\\u4a98\\u4a99\\u4a9a\\u4a9b\\u4a9c\\u4a9d\\u4a9e\\u4a9f\\u4aa0\\u4aa1\\u4aa2\\u4aa3\\u4aa4\\u4aa5\\u4aa6\\u4aa7\\u4aa8\\u4aa9\\u4aaa\\u4aab\\u4aac\\u4aad\\u4aae\\u4aaf\\u4ab0\\u4ab1\\u4ab2\\u4ab3\\u4ab4\\u4ab5\\u4ab6\\u4ab7\\u4ab8\\u4ab9\\u4aba\\u4abb\\u4abc\\u4abd\\u4abe\\u4abf\\u4ac0\\u4ac1\\u4ac2\\u4ac3\\u4ac4\\u4ac5\\u4ac6\\u4ac7\\u4ac8\\u4ac9\\u4aca\\u4acb\\u4acc\\u4acd\\u4ace\\u4acf\\u4ad0\\u4ad1\\u4ad2\\u4ad3\\u4ad4\\u4ad5\\u4ad6\\u4ad7\\u4ad8\\u4ad9\\u4ada\\u4adb\\u4adc\\u4add\\u4ade\\u4adf\\u4ae0\\u4ae1\\u4ae2\\u4ae3\\u4ae4\\u4ae5\\u4ae6\\u4ae7\\u4ae8\\u4ae9\\u4aea\\u4aeb\\u4aec\\u4aed\\u4aee\\u4aef\\u4af0\\u4af1\\u4af2\\u4af3\\u4af4\\u4af5\\u4af6\\u4af7\\u4af8\\u4af9\\u4afa\\u4afb\\u4afc\\u4afd\\u4afe\\u4aff\\u4b00\\u4b01\\u4b02\\u4b03\\u4b04\\u4b05\\u4b06\\u4b07\\u4b08\\u4b09\\u4b0a\\u4b0b\\u4b0c\\u4b0d\\u4b0e\\u4b0f\\u4b10\\u4b11\\u4b12\\u4b13\\u4b14\\u4b15\\u4b16\\u4b17\\u4b18\\u4b19\\u4b1a\\u4b1b\\u4b1c\\u4b1d\\u4b1e\\u4b1f\\u4b20\\u4b21\\u4b22\\u4b23\\u4b24\\u4b25\\u4b26\\u4b27\\u4b28\\u4b29\\u4b2a\\u4b2b\\u4b2c\\u4b2d\\u4b2e\\u4b2f\\u4b30\\u4b31\\u4b32\\u4b33\\u4b34\\u4b35\\u4b36\\u4b37\\u4b38\\u4b39\\u4b3a\\u4b3b\\u4b3c\\u4b3d\\u4b3e\\u4b3f\\u4b40\\u4b41\\u4b42\\u4b43\\u4b44\\u4b45\\u4b46\\u4b47\\u4b48\\u4b49\\u4b4a\\u4b4b\\u4b4c\\u4b4d\\u4b4e\\u4b4f\\u4b50\\u4b51\\u4b52\\u4b53\\u4b54\\u4b55\\u4b56\\u4b57\\u4b58\\u4b59\\u4b5a\\u4b5b\\u4b5c\\u4b5d\\u4b5e\\u4b5f\\u4b60\\u4b61\\u4b62\\u4b63\\u4b64\\u4b65\\u4b66\\u4b67\\u4b68\\u4b69\\u4b6a\\u4b6b\\u4b6c\\u4b6d\\u4b6e\\u4b6f\\u4b70\\u4b71\\u4b72\\u4b73\\u4b74\\u4b75\\u4b76\\u4b77\\u4b78\\u4b79\\u4b7a\\u4b7b\\u4b7c\\u4b7d\\u4b7e\\u4b7f\\u4b80\\u4b81\\u4b82\\u4b83\\u4b84\\u4b85\\u4b86\\u4b87\\u4b88\\u4b89\\u4b8a\\u4b8b\\u4b8c\\u4b8d\\u4b8e\\u4b8f\\u4b90\\u4b91\\u4b92\\u4b93\\u4b94\\u4b95\\u4b96\\u4b97\\u4b98\\u4b99\\u4b9a\\u4b9b\\u4b9c\\u4b9d\\u4b9e\\u4b9f\\u4ba0\\u4ba1\\u4ba2\\u4ba3\\u4ba4\\u4ba5\\u4ba6\\u4ba7\\u4ba8\\u4ba9\\u4baa\\u4bab\\u4bac\\u4bad\\u4bae\\u4baf\\u4bb0\\u4bb1\\u4bb2\\u4bb3\\u4bb4\\u4bb5\\u4bb6\\u4bb7\\u4bb8\\u4bb9\\u4bba\\u4bbb\\u4bbc\\u4bbd\\u4bbe\\u4bbf\\u4bc0\\u4bc1\\u4bc2\\u4bc3\\u4bc4\\u4bc5\\u4bc6\\u4bc7\\u4bc8\\u4bc9\\u4bca\\u4bcb\\u4bcc\\u4bcd\\u4bce\\u4bcf\\u4bd0\\u4bd1\\u4bd2\\u4bd3\\u4bd4\\u4bd5\\u4bd6\\u4bd7\\u4bd8\\u4bd9\\u4bda\\u4bdb\\u4bdc\\u4bdd\\u4bde\\u4bdf\\u4be0\\u4be1\\u4be2\\u4be3\\u4be4\\u4be5\\u4be6\\u4be7\\u4be8\\u4be9\\u4bea\\u4beb\\u4bec\\u4bed\\u4bee\\u4bef\\u4bf0\\u4bf1\\u4bf2\\u4bf3\\u4bf4\\u4bf5\\u4bf6\\u4bf7\\u4bf8\\u4bf9\\u4bfa\\u4bfb\\u4bfc\\u4bfd\\u4bfe\\u4bff\\u4c00\\u4c01\\u4c02\\u4c03\\u4c04\\u4c05\\u4c06\\u4c07\\u4c08\\u4c09\\u4c0a\\u4c0b\\u4c0c\\u4c0d\\u4c0e\\u4c0f\\u4c10\\u4c11\\u4c12\\u4c13\\u4c14\\u4c15\\u4c16\\u4c17\\u4c18\\u4c19\\u4c1a\\u4c1b\\u4c1c\\u4c1d\\u4c1e\\u4c1f\\u4c20\\u4c21\\u4c22\\u4c23\\u4c24\\u4c25\\u4c26\\u4c27\\u4c28\\u4c29\\u4c2a\\u4c2b\\u4c2c\\u4c2d\\u4c2e\\u4c2f\\u4c30\\u4c31\\u4c32\\u4c33\\u4c34\\u4c35\\u4c36\\u4c37\\u4c38\\u4c39\\u4c3a\\u4c3b\\u4c3c\\u4c3d\\u4c3e\\u4c3f\\u4c40\\u4c41\\u4c42\\u4c43\\u4c44\\u4c45\\u4c46\\u4c47\\u4c48\\u4c49\\u4c4a\\u4c4b\\u4c4c\\u4c4d\\u4c4e\\u4c4f\\u4c50\\u4c51\\u4c52\\u4c53\\u4c54\\u4c55\\u4c56\\u4c57\\u4c58\\u4c59\\u4c5a\\u4c5b\\u4c5c\\u4c5d\\u4c5e\\u4c5f\\u4c60\\u4c61\\u4c62\\u4c63\\u4c64\\u4c65\\u4c66\\u4c67\\u4c68\\u4c69\\u4c6a\\u4c6b\\u4c6c\\u4c6d\\u4c6e\\u4c6f\\u4c70\\u4c71\\u4c72\\u4c73\\u4c74\\u4c75\\u4c76\\u4c77\\u4c78\\u4c79\\u4c7a\\u4c7b\\u4c7c\\u4c7d\\u4c7e\\u4c7f\\u4c80\\u4c81\\u4c82\\u4c83\\u4c84\\u4c85\\u4c86\\u4c87\\u4c88\\u4c89\\u4c8a\\u4c8b\\u4c8c\\u4c8d\\u4c8e\\u4c8f\\u4c90\\u4c91\\u4c92\\u4c93\\u4c94\\u4c95\\u4c96\\u4c97\\u4c98\\u4c99\\u4c9a\\u4c9b\\u4c9c\\u4c9d\\u4c9e\\u4c9f\\u4ca0\\u4ca1\\u4ca2\\u4ca3\\u4ca4\\u4ca5\\u4ca6\\u4ca7\\u4ca8\\u4ca9\\u4caa\\u4cab\\u4cac\\u4cad\\u4cae\\u4caf\\u4cb0\\u4cb1\\u4cb2\\u4cb3\\u4cb4\\u4cb5\\u4cb6\\u4cb7\\u4cb8\\u4cb9\\u4cba\\u4cbb\\u4cbc\\u4cbd\\u4cbe\\u4cbf\\u4cc0\\u4cc1\\u4cc2\\u4cc3\\u4cc4\\u4cc5\\u4cc6\\u4cc7\\u4cc8\\u4cc9\\u4cca\\u4ccb\\u4ccc\\u4ccd\\u4cce\\u4ccf\\u4cd0\\u4cd1\\u4cd2\\u4cd3\\u4cd4\\u4cd5\\u4cd6\\u4cd7\\u4cd8\\u4cd9\\u4cda\\u4cdb\\u4cdc\\u4cdd\\u4cde\\u4cdf\\u4ce0\\u4ce1\\u4ce2\\u4ce3\\u4ce4\\u4ce5\\u4ce6\\u4ce7\\u4ce8\\u4ce9\\u4cea\\u4ceb\\u4cec\\u4ced\\u4cee\\u4cef\\u4cf0\\u4cf1\\u4cf2\\u4cf3\\u4cf4\\u4cf5\\u4cf6\\u4cf7\\u4cf8\\u4cf9\\u4cfa\\u4cfb\\u4cfc\\u4cfd\\u4cfe\\u4cff\\u4d00\\u4d01\\u4d02\\u4d03\\u4d04\\u4d05\\u4d06\\u4d07\\u4d08\\u4d09\\u4d0a\\u4d0b\\u4d0c\\u4d0d\\u4d0e\\u4d0f\\u4d10\\u4d11\\u4d12\\u4d13\\u4d14\\u4d15\\u4d16\\u4d17\\u4d18\\u4d19\\u4d1a\\u4d1b\\u4d1c\\u4d1d\\u4d1e\\u4d1f\\u4d20\\u4d21\\u4d22\\u4d23\\u4d24\\u4d25\\u4d26\\u4d27\\u4d28\\u4d29\\u4d2a\\u4d2b\\u4d2c\\u4d2d\\u4d2e\\u4d2f\\u4d30\\u4d31\\u4d32\\u4d33\\u4d34\\u4d35\\u4d36\\u4d37\\u4d38\\u4d39\\u4d3a\\u4d3b\\u4d3c\\u4d3d\\u4d3e\\u4d3f\\u4d40\\u4d41\\u4d42\\u4d43\\u4d44\\u4d45\\u4d46\\u4d47\\u4d48\\u4d49\\u4d4a\\u4d4b\\u4d4c\\u4d4d\\u4d4e\\u4d4f\\u4d50\\u4d51\\u4d52\\u4d53\\u4d54\\u4d55\\u4d56\\u4d57\\u4d58\\u4d59\\u4d5a\\u4d5b\\u4d5c\\u4d5d\\u4d5e\\u4d5f\\u4d60\\u4d61\\u4d62\\u4d63\\u4d64\\u4d65\\u4d66\\u4d67\\u4d68\\u4d69\\u4d6a\\u4d6b\\u4d6c\\u4d6d\\u4d6e\\u4d6f\\u4d70\\u4d71\\u4d72\\u4d73\\u4d74\\u4d75\\u4d76\\u4d77\\u4d78\\u4d79\\u4d7a\\u4d7b\\u4d7c\\u4d7d\\u4d7e\\u4d7f\\u4d80\\u4d81\\u4d82\\u4d83\\u4d84\\u4d85\\u4d86\\u4d87\\u4d88\\u4d89\\u4d8a\\u4d8b\\u4d8c\\u4d8d\\u4d8e\\u4d8f\\u4d90\\u4d91\\u4d92\\u4d93\\u4d94\\u4d95\\u4d96\\u4d97\\u4d98\\u4d99\\u4d9a\\u4d9b\\u4d9c\\u4d9d\\u4d9e\\u4d9f\\u4da0\\u4da1\\u4da2\\u4da3\\u4da4\\u4da5\\u4da6\\u4da7\\u4da8\\u4da9\\u4daa\\u4dab\\u4dac\\u4dad\\u4dae\\u4daf\\u4db0\\u4db1\\u4db2\\u4db3\\u4db4\\u4db5\\u4e00\\u4e01\\u4e02\\u4e03\\u4e04\\u4e05\\u4e06\\u4e07\\u4e08\\u4e09\\u4e0a\\u4e0b\\u4e0c\\u4e0d\\u4e0e\\u4e0f\\u4e10\\u4e11\\u4e12\\u4e13\\u4e14\\u4e15\\u4e16\\u4e17\\u4e18\\u4e19\\u4e1a\\u4e1b\\u4e1c\\u4e1d\\u4e1e\\u4e1f\\u4e20\\u4e21\\u4e22\\u4e23\\u4e24\\u4e25\\u4e26\\u4e27\\u4e28\\u4e29\\u4e2a\\u4e2b\\u4e2c\\u4e2d\\u4e2e\\u4e2f\\u4e30\\u4e31\\u4e32\\u4e33\\u4e34\\u4e35\\u4e36\\u4e37\\u4e38\\u4e39\\u4e3a\\u4e3b\\u4e3c\\u4e3d\\u4e3e\\u4e3f\\u4e40\\u4e41\\u4e42\\u4e43\\u4e44\\u4e45\\u4e46\\u4e47\\u4e48\\u4e49\\u4e4a\\u4e4b\\u4e4c\\u4e4d\\u4e4e\\u4e4f\\u4e50\\u4e51\\u4e52\\u4e53\\u4e54\\u4e55\\u4e56\\u4e57\\u4e58\\u4e59\\u4e5a\\u4e5b\\u4e5c\\u4e5d\\u4e5e\\u4e5f\\u4e60\\u4e61\\u4e62\\u4e63\\u4e64\\u4e65\\u4e66\\u4e67\\u4e68\\u4e69\\u4e6a\\u4e6b\\u4e6c\\u4e6d\\u4e6e\\u4e6f\\u4e70\\u4e71\\u4e72\\u4e73\\u4e74\\u4e75\\u4e76\\u4e77\\u4e78\\u4e79\\u4e7a\\u4e7b\\u4e7c\\u4e7d\\u4e7e\\u4e7f\\u4e80\\u4e81\\u4e82\\u4e83\\u4e84\\u4e85\\u4e86\\u4e87\\u4e88\\u4e89\\u4e8a\\u4e8b\\u4e8c\\u4e8d\\u4e8e\\u4e8f\\u4e90\\u4e91\\u4e92\\u4e93\\u4e94\\u4e95\\u4e96\\u4e97\\u4e98\\u4e99\\u4e9a\\u4e9b\\u4e9c\\u4e9d\\u4e9e\\u4e9f\\u4ea0\\u4ea1\\u4ea2\\u4ea3\\u4ea4\\u4ea5\\u4ea6\\u4ea7\\u4ea8\\u4ea9\\u4eaa\\u4eab\\u4eac\\u4ead\\u4eae\\u4eaf\\u4eb0\\u4eb1\\u4eb2\\u4eb3\\u4eb4\\u4eb5\\u4eb6\\u4eb7\\u4eb8\\u4eb9\\u4eba\\u4ebb\\u4ebc\\u4ebd\\u4ebe\\u4ebf\\u4ec0\\u4ec1\\u4ec2\\u4ec3\\u4ec4\\u4ec5\\u4ec6\\u4ec7\\u4ec8\\u4ec9\\u4eca\\u4ecb\\u4ecc\\u4ecd\\u4ece\\u4ecf\\u4ed0\\u4ed1\\u4ed2\\u4ed3\\u4ed4\\u4ed5\\u4ed6\\u4ed7\\u4ed8\\u4ed9\\u4eda\\u4edb\\u4edc\\u4edd\\u4ede\\u4edf\\u4ee0\\u4ee1\\u4ee2\\u4ee3\\u4ee4\\u4ee5\\u4ee6\\u4ee7\\u4ee8\\u4ee9\\u4eea\\u4eeb\\u4eec\\u4eed\\u4eee\\u4eef\\u4ef0\\u4ef1\\u4ef2\\u4ef3\\u4ef4\\u4ef5\\u4ef6\\u4ef7\\u4ef8\\u4ef9\\u4efa\\u4efb\\u4efc\\u4efd\\u4efe\\u4eff\\u4f00\\u4f01\\u4f02\\u4f03\\u4f04\\u4f05\\u4f06\\u4f07\\u4f08\\u4f09\\u4f0a\\u4f0b\\u4f0c\\u4f0d\\u4f0e\\u4f0f\\u4f10\\u4f11\\u4f12\\u4f13\\u4f14\\u4f15\\u4f16\\u4f17\\u4f18\\u4f19\\u4f1a\\u4f1b\\u4f1c\\u4f1d\\u4f1e\\u4f1f\\u4f20\\u4f21\\u4f22\\u4f23\\u4f24\\u4f25\\u4f26\\u4f27\\u4f28\\u4f29\\u4f2a\\u4f2b\\u4f2c\\u4f2d\\u4f2e\\u4f2f\\u4f30\\u4f31\\u4f32\\u4f33\\u4f34\\u4f35\\u4f36\\u4f37\\u4f38\\u4f39\\u4f3a\\u4f3b\\u4f3c\\u4f3d\\u4f3e\\u4f3f\\u4f40\\u4f41\\u4f42\\u4f43\\u4f44\\u4f45\\u4f46\\u4f47\\u4f48\\u4f49\\u4f4a\\u4f4b\\u4f4c\\u4f4d\\u4f4e\\u4f4f\\u4f50\\u4f51\\u4f52\\u4f53\\u4f54\\u4f55\\u4f56\\u4f57\\u4f58\\u4f59\\u4f5a\\u4f5b\\u4f5c\\u4f5d\\u4f5e\\u4f5f\\u4f60\\u4f61\\u4f62\\u4f63\\u4f64\\u4f65\\u4f66\\u4f67\\u4f68\\u4f69\\u4f6a\\u4f6b\\u4f6c\\u4f6d\\u4f6e\\u4f6f\\u4f70\\u4f71\\u4f72\\u4f73\\u4f74\\u4f75\\u4f76\\u4f77\\u4f78\\u4f79\\u4f7a\\u4f7b\\u4f7c\\u4f7d\\u4f7e\\u4f7f\\u4f80\\u4f81\\u4f82\\u4f83\\u4f84\\u4f85\\u4f86\\u4f87\\u4f88\\u4f89\\u4f8a\\u4f8b\\u4f8c\\u4f8d\\u4f8e\\u4f8f\\u4f90\\u4f91\\u4f92\\u4f93\\u4f94\\u4f95\\u4f96\\u4f97\\u4f98\\u4f99\\u4f9a\\u4f9b\\u4f9c\\u4f9d\\u4f9e\\u4f9f\\u4fa0\\u4fa1\\u4fa2\\u4fa3\\u4fa4\\u4fa5\\u4fa6\\u4fa7\\u4fa8\\u4fa9\\u4faa\\u4fab\\u4fac\\u4fad\\u4fae\\u4faf\\u4fb0\\u4fb1\\u4fb2\\u4fb3\\u4fb4\\u4fb5\\u4fb6\\u4fb7\\u4fb8\\u4fb9\\u4fba\\u4fbb\\u4fbc\\u4fbd\\u4fbe\\u4fbf\\u4fc0\\u4fc1\\u4fc2\\u4fc3\\u4fc4\\u4fc5\\u4fc6\\u4fc7\\u4fc8\\u4fc9\\u4fca\\u4fcb\\u4fcc\\u4fcd\\u4fce\\u4fcf\\u4fd0\\u4fd1\\u4fd2\\u4fd3\\u4fd4\\u4fd5\\u4fd6\\u4fd7\\u4fd8\\u4fd9\\u4fda\\u4fdb\\u4fdc\\u4fdd\\u4fde\\u4fdf\\u4fe0\\u4fe1\\u4fe2\\u4fe3\\u4fe4\\u4fe5\\u4fe6\\u4fe7\\u4fe8\\u4fe9\\u4fea\\u4feb\\u4fec\\u4fed\\u4fee\\u4fef\\u4ff0\\u4ff1\\u4ff2\\u4ff3\\u4ff4\\u4ff5\\u4ff6\\u4ff7\\u4ff8\\u4ff9\\u4ffa\\u4ffb\\u4ffc\\u4ffd\\u4ffe\\u4fff\\u5000\\u5001\\u5002\\u5003\\u5004\\u5005\\u5006\\u5007\\u5008\\u5009\\u500a\\u500b\\u500c\\u500d\\u500e\\u500f\\u5010\\u5011\\u5012\\u5013\\u5014\\u5015\\u5016\\u5017\\u5018\\u5019\\u501a\\u501b\\u501c\\u501d\\u501e\\u501f\\u5020\\u5021\\u5022\\u5023\\u5024\\u5025\\u5026\\u5027\\u5028\\u5029\\u502a\\u502b\\u502c\\u502d\\u502e\\u502f\\u5030\\u5031\\u5032\\u5033\\u5034\\u5035\\u5036\\u5037\\u5038\\u5039\\u503a\\u503b\\u503c\\u503d\\u503e\\u503f\\u5040\\u5041\\u5042\\u5043\\u5044\\u5045\\u5046\\u5047\\u5048\\u5049\\u504a\\u504b\\u504c\\u504d\\u504e\\u504f\\u5050\\u5051\\u5052\\u5053\\u5054\\u5055\\u5056\\u5057\\u5058\\u5059\\u505a\\u505b\\u505c\\u505d\\u505e\\u505f\\u5060\\u5061\\u5062\\u5063\\u5064\\u5065\\u5066\\u5067\\u5068\\u5069\\u506a\\u506b\\u506c\\u506d\\u506e\\u506f\\u5070\\u5071\\u5072\\u5073\\u5074\\u5075\\u5076\\u5077\\u5078\\u5079\\u507a\\u507b\\u507c\\u507d\\u507e\\u507f\\u5080\\u5081\\u5082\\u5083\\u5084\\u5085\\u5086\\u5087\\u5088\\u5089\\u508a\\u508b\\u508c\\u508d\\u508e\\u508f\\u5090\\u5091\\u5092\\u5093\\u5094\\u5095\\u5096\\u5097\\u5098\\u5099\\u509a\\u509b\\u509c\\u509d\\u509e\\u509f\\u50a0\\u50a1\\u50a2\\u50a3\\u50a4\\u50a5\\u50a6\\u50a7\\u50a8\\u50a9\\u50aa\\u50ab\\u50ac\\u50ad\\u50ae\\u50af\\u50b0\\u50b1\\u50b2\\u50b3\\u50b4\\u50b5\\u50b6\\u50b7\\u50b8\\u50b9\\u50ba\\u50bb\\u50bc\\u50bd\\u50be\\u50bf\\u50c0\\u50c1\\u50c2\\u50c3\\u50c4\\u50c5\\u50c6\\u50c7\\u50c8\\u50c9\\u50ca\\u50cb\\u50cc\\u50cd\\u50ce\\u50cf\\u50d0\\u50d1\\u50d2\\u50d3\\u50d4\\u50d5\\u50d6\\u50d7\\u50d8\\u50d9\\u50da\\u50db\\u50dc\\u50dd\\u50de\\u50df\\u50e0\\u50e1\\u50e2\\u50e3\\u50e4\\u50e5\\u50e6\\u50e7\\u50e8\\u50e9\\u50ea\\u50eb\\u50ec\\u50ed\\u50ee\\u50ef\\u50f0\\u50f1\\u50f2\\u50f3\\u50f4\\u50f5\\u50f6\\u50f7\\u50f8\\u50f9\\u50fa\\u50fb\\u50fc\\u50fd\\u50fe\\u50ff\\u5100\\u5101\\u5102\\u5103\\u5104\\u5105\\u5106\\u5107\\u5108\\u5109\\u510a\\u510b\\u510c\\u510d\\u510e\\u510f\\u5110\\u5111\\u5112\\u5113\\u5114\\u5115\\u5116\\u5117\\u5118\\u5119\\u511a\\u511b\\u511c\\u511d\\u511e\\u511f\\u5120\\u5121\\u5122\\u5123\\u5124\\u5125\\u5126\\u5127\\u5128\\u5129\\u512a\\u512b\\u512c\\u512d\\u512e\\u512f\\u5130\\u5131\\u5132\\u5133\\u5134\\u5135\\u5136\\u5137\\u5138\\u5139\\u513a\\u513b\\u513c\\u513d\\u513e\\u513f\\u5140\\u5141\\u5142\\u5143\\u5144\\u5145\\u5146\\u5147\\u5148\\u5149\\u514a\\u514b\\u514c\\u514d\\u514e\\u514f\\u5150\\u5151\\u5152\\u5153\\u5154\\u5155\\u5156\\u5157\\u5158\\u5159\\u515a\\u515b\\u515c\\u515d\\u515e\\u515f\\u5160\\u5161\\u5162\\u5163\\u5164\\u5165\\u5166\\u5167\\u5168\\u5169\\u516a\\u516b\\u516c\\u516d\\u516e\\u516f\\u5170\\u5171\\u5172\\u5173\\u5174\\u5175\\u5176\\u5177\\u5178\\u5179\\u517a\\u517b\\u517c\\u517d\\u517e\\u517f\\u5180\\u5181\\u5182\\u5183\\u5184\\u5185\\u5186\\u5187\\u5188\\u5189\\u518a\\u518b\\u518c\\u518d\\u518e\\u518f\\u5190\\u5191\\u5192\\u5193\\u5194\\u5195\\u5196\\u5197\\u5198\\u5199\\u519a\\u519b\\u519c\\u519d\\u519e\\u519f\\u51a0\\u51a1\\u51a2\\u51a3\\u51a4\\u51a5\\u51a6\\u51a7\\u51a8\\u51a9\\u51aa\\u51ab\\u51ac\\u51ad\\u51ae\\u51af\\u51b0\\u51b1\\u51b2\\u51b3\\u51b4\\u51b5\\u51b6\\u51b7\\u51b8\\u51b9\\u51ba\\u51bb\\u51bc\\u51bd\\u51be\\u51bf\\u51c0\\u51c1\\u51c2\\u51c3\\u51c4\\u51c5\\u51c6\\u51c7\\u51c8\\u51c9\\u51ca\\u51cb\\u51cc\\u51cd\\u51ce\\u51cf\\u51d0\\u51d1\\u51d2\\u51d3\\u51d4\\u51d5\\u51d6\\u51d7\\u51d8\\u51d9\\u51da\\u51db\\u51dc\\u51dd\\u51de\\u51df\\u51e0\\u51e1\\u51e2\\u51e3\\u51e4\\u51e5\\u51e6\\u51e7\\u51e8\\u51e9\\u51ea\\u51eb\\u51ec\\u51ed\\u51ee\\u51ef\\u51f0\\u51f1\\u51f2\\u51f3\\u51f4\\u51f5\\u51f6\\u51f7\\u51f8\\u51f9\\u51fa\\u51fb\\u51fc\\u51fd\\u51fe\\u51ff\\u5200\\u5201\\u5202\\u5203\\u5204\\u5205\\u5206\\u5207\\u5208\\u5209\\u520a\\u520b\\u520c\\u520d\\u520e\\u520f\\u5210\\u5211\\u5212\\u5213\\u5214\\u5215\\u5216\\u5217\\u5218\\u5219\\u521a\\u521b\\u521c\\u521d\\u521e\\u521f\\u5220\\u5221\\u5222\\u5223\\u5224\\u5225\\u5226\\u5227\\u5228\\u5229\\u522a\\u522b\\u522c\\u522d\\u522e\\u522f\\u5230\\u5231\\u5232\\u5233\\u5234\\u5235\\u5236\\u5237\\u5238\\u5239\\u523a\\u523b\\u523c\\u523d\\u523e\\u523f\\u5240\\u5241\\u5242\\u5243\\u5244\\u5245\\u5246\\u5247\\u5248\\u5249\\u524a\\u524b\\u524c\\u524d\\u524e\\u524f\\u5250\\u5251\\u5252\\u5253\\u5254\\u5255\\u5256\\u5257\\u5258\\u5259\\u525a\\u525b\\u525c\\u525d\\u525e\\u525f\\u5260\\u5261\\u5262\\u5263\\u5264\\u5265\\u5266\\u5267\\u5268\\u5269\\u526a\\u526b\\u526c\\u526d\\u526e\\u526f\\u5270\\u5271\\u5272\\u5273\\u5274\\u5275\\u5276\\u5277\\u5278\\u5279\\u527a\\u527b\\u527c\\u527d\\u527e\\u527f\\u5280\\u5281\\u5282\\u5283\\u5284\\u5285\\u5286\\u5287\\u5288\\u5289\\u528a\\u528b\\u528c\\u528d\\u528e\\u528f\\u5290\\u5291\\u5292\\u5293\\u5294\\u5295\\u5296\\u5297\\u5298\\u5299\\u529a\\u529b\\u529c\\u529d\\u529e\\u529f\\u52a0\\u52a1\\u52a2\\u52a3\\u52a4\\u52a5\\u52a6\\u52a7\\u52a8\\u52a9\\u52aa\\u52ab\\u52ac\\u52ad\\u52ae\\u52af\\u52b0\\u52b1\\u52b2\\u52b3\\u52b4\\u52b5\\u52b6\\u52b7\\u52b8\\u52b9\\u52ba\\u52bb\\u52bc\\u52bd\\u52be\\u52bf\\u52c0\\u52c1\\u52c2\\u52c3\\u52c4\\u52c5\\u52c6\\u52c7\\u52c8\\u52c9\\u52ca\\u52cb\\u52cc\\u52cd\\u52ce\\u52cf\\u52d0\\u52d1\\u52d2\\u52d3\\u52d4\\u52d5\\u52d6\\u52d7\\u52d8\\u52d9\\u52da\\u52db\\u52dc\\u52dd\\u52de\\u52df\\u52e0\\u52e1\\u52e2\\u52e3\\u52e4\\u52e5\\u52e6\\u52e7\\u52e8\\u52e9\\u52ea\\u52eb\\u52ec\\u52ed\\u52ee\\u52ef\\u52f0\\u52f1\\u52f2\\u52f3\\u52f4\\u52f5\\u52f6\\u52f7\\u52f8\\u52f9\\u52fa\\u52fb\\u52fc\\u52fd\\u52fe\\u52ff\\u5300\\u5301\\u5302\\u5303\\u5304\\u5305\\u5306\\u5307\\u5308\\u5309\\u530a\\u530b\\u530c\\u530d\\u530e\\u530f\\u5310\\u5311\\u5312\\u5313\\u5314\\u5315\\u5316\\u5317\\u5318\\u5319\\u531a\\u531b\\u531c\\u531d\\u531e\\u531f\\u5320\\u5321\\u5322\\u5323\\u5324\\u5325\\u5326\\u5327\\u5328\\u5329\\u532a\\u532b\\u532c\\u532d\\u532e\\u532f\\u5330\\u5331\\u5332\\u5333\\u5334\\u5335\\u5336\\u5337\\u5338\\u5339\\u533a\\u533b\\u533c\\u533d\\u533e\\u533f\\u5340\\u5341\\u5342\\u5343\\u5344\\u5345\\u5346\\u5347\\u5348\\u5349\\u534a\\u534b\\u534c\\u534d\\u534e\\u534f\\u5350\\u5351\\u5352\\u5353\\u5354\\u5355\\u5356\\u5357\\u5358\\u5359\\u535a\\u535b\\u535c\\u535d\\u535e\\u535f\\u5360\\u5361\\u5362\\u5363\\u5364\\u5365\\u5366\\u5367\\u5368\\u5369\\u536a\\u536b\\u536c\\u536d\\u536e\\u536f\\u5370\\u5371\\u5372\\u5373\\u5374\\u5375\\u5376\\u5377\\u5378\\u5379\\u537a\\u537b\\u537c\\u537d\\u537e\\u537f\\u5380\\u5381\\u5382\\u5383\\u5384\\u5385\\u5386\\u5387\\u5388\\u5389\\u538a\\u538b\\u538c\\u538d\\u538e\\u538f\\u5390\\u5391\\u5392\\u5393\\u5394\\u5395\\u5396\\u5397\\u5398\\u5399\\u539a\\u539b\\u539c\\u539d\\u539e\\u539f\\u53a0\\u53a1\\u53a2\\u53a3\\u53a4\\u53a5\\u53a6\\u53a7\\u53a8\\u53a9\\u53aa\\u53ab\\u53ac\\u53ad\\u53ae\\u53af\\u53b0\\u53b1\\u53b2\\u53b3\\u53b4\\u53b5\\u53b6\\u53b7\\u53b8\\u53b9\\u53ba\\u53bb\\u53bc\\u53bd\\u53be\\u53bf\\u53c0\\u53c1\\u53c2\\u53c3\\u53c4\\u53c5\\u53c6\\u53c7\\u53c8\\u53c9\\u53ca\\u53cb\\u53cc\\u53cd\\u53ce\\u53cf\\u53d0\\u53d1\\u53d2\\u53d3\\u53d4\\u53d5\\u53d6\\u53d7\\u53d8\\u53d9\\u53da\\u53db\\u53dc\\u53dd\\u53de\\u53df\\u53e0\\u53e1\\u53e2\\u53e3\\u53e4\\u53e5\\u53e6\\u53e7\\u53e8\\u53e9\\u53ea\\u53eb\\u53ec\\u53ed\\u53ee\\u53ef\\u53f0\\u53f1\\u53f2\\u53f3\\u53f4\\u53f5\\u53f6\\u53f7\\u53f8\\u53f9\\u53fa\\u53fb\\u53fc\\u53fd\\u53fe\\u53ff\\u5400\\u5401\\u5402\\u5403\\u5404\\u5405\\u5406\\u5407\\u5408\\u5409\\u540a\\u540b\\u540c\\u540d\\u540e\\u540f\\u5410\\u5411\\u5412\\u5413\\u5414\\u5415\\u5416\\u5417\\u5418\\u5419\\u541a\\u541b\\u541c\\u541d\\u541e\\u541f\\u5420\\u5421\\u5422\\u5423\\u5424\\u5425\\u5426\\u5427\\u5428\\u5429\\u542a\\u542b\\u542c\\u542d\\u542e\\u542f\\u5430\\u5431\\u5432\\u5433\\u5434\\u5435\\u5436\\u5437\\u5438\\u5439\\u543a\\u543b\\u543c\\u543d\\u543e\\u543f\\u5440\\u5441\\u5442\\u5443\\u5444\\u5445\\u5446\\u5447\\u5448\\u5449\\u544a\\u544b\\u544c\\u544d\\u544e\\u544f\\u5450\\u5451\\u5452\\u5453\\u5454\\u5455\\u5456\\u5457\\u5458\\u5459\\u545a\\u545b\\u545c\\u545d\\u545e\\u545f\\u5460\\u5461\\u5462\\u5463\\u5464\\u5465\\u5466\\u5467\\u5468\\u5469\\u546a\\u546b\\u546c\\u546d\\u546e\\u546f\\u5470\\u5471\\u5472\\u5473\\u5474\\u5475\\u5476\\u5477\\u5478\\u5479\\u547a\\u547b\\u547c\\u547d\\u547e\\u547f\\u5480\\u5481\\u5482\\u5483\\u5484\\u5485\\u5486\\u5487\\u5488\\u5489\\u548a\\u548b\\u548c\\u548d\\u548e\\u548f\\u5490\\u5491\\u5492\\u5493\\u5494\\u5495\\u5496\\u5497\\u5498\\u5499\\u549a\\u549b\\u549c\\u549d\\u549e\\u549f\\u54a0\\u54a1\\u54a2\\u54a3\\u54a4\\u54a5\\u54a6\\u54a7\\u54a8\\u54a9\\u54aa\\u54ab\\u54ac\\u54ad\\u54ae\\u54af\\u54b0\\u54b1\\u54b2\\u54b3\\u54b4\\u54b5\\u54b6\\u54b7\\u54b8\\u54b9\\u54ba\\u54bb\\u54bc\\u54bd\\u54be\\u54bf\\u54c0\\u54c1\\u54c2\\u54c3\\u54c4\\u54c5\\u54c6\\u54c7\\u54c8\\u54c9\\u54ca\\u54cb\\u54cc\\u54cd\\u54ce\\u54cf\\u54d0\\u54d1\\u54d2\\u54d3\\u54d4\\u54d5\\u54d6\\u54d7\\u54d8\\u54d9\\u54da\\u54db\\u54dc\\u54dd\\u54de\\u54df\\u54e0\\u54e1\\u54e2\\u54e3\\u54e4\\u54e5\\u54e6\\u54e7\\u54e8\\u54e9\\u54ea\\u54eb\\u54ec\\u54ed\\u54ee\\u54ef\\u54f0\\u54f1\\u54f2\\u54f3\\u54f4\\u54f5\\u54f6\\u54f7\\u54f8\\u54f9\\u54fa\\u54fb\\u54fc\\u54fd\\u54fe\\u54ff\\u5500\\u5501\\u5502\\u5503\\u5504\\u5505\\u5506\\u5507\\u5508\\u5509\\u550a\\u550b\\u550c\\u550d\\u550e\\u550f\\u5510\\u5511\\u5512\\u5513\\u5514\\u5515\\u5516\\u5517\\u5518\\u5519\\u551a\\u551b\\u551c\\u551d\\u551e\\u551f\\u5520\\u5521\\u5522\\u5523\\u5524\\u5525\\u5526\\u5527\\u5528\\u5529\\u552a\\u552b\\u552c\\u552d\\u552e\\u552f\\u5530\\u5531\\u5532\\u5533\\u5534\\u5535\\u5536\\u5537\\u5538\\u5539\\u553a\\u553b\\u553c\\u553d\\u553e\\u553f\\u5540\\u5541\\u5542\\u5543\\u5544\\u5545\\u5546\\u5547\\u5548\\u5549\\u554a\\u554b\\u554c\\u554d\\u554e\\u554f\\u5550\\u5551\\u5552\\u5553\\u5554\\u5555\\u5556\\u5557\\u5558\\u5559\\u555a\\u555b\\u555c\\u555d\\u555e\\u555f\\u5560\\u5561\\u5562\\u5563\\u5564\\u5565\\u5566\\u5567\\u5568\\u5569\\u556a\\u556b\\u556c\\u556d\\u556e\\u556f\\u5570\\u5571\\u5572\\u5573\\u5574\\u5575\\u5576\\u5577\\u5578\\u5579\\u557a\\u557b\\u557c\\u557d\\u557e\\u557f\\u5580\\u5581\\u5582\\u5583\\u5584\\u5585\\u5586\\u5587\\u5588\\u5589\\u558a\\u558b\\u558c\\u558d\\u558e\\u558f\\u5590\\u5591\\u5592\\u5593\\u5594\\u5595\\u5596\\u5597\\u5598\\u5599\\u559a\\u559b\\u559c\\u559d\\u559e\\u559f\\u55a0\\u55a1\\u55a2\\u55a3\\u55a4\\u55a5\\u55a6\\u55a7\\u55a8\\u55a9\\u55aa\\u55ab\\u55ac\\u55ad\\u55ae\\u55af\\u55b0\\u55b1\\u55b2\\u55b3\\u55b4\\u55b5\\u55b6\\u55b7\\u55b8\\u55b9\\u55ba\\u55bb\\u55bc\\u55bd\\u55be\\u55bf\\u55c0\\u55c1\\u55c2\\u55c3\\u55c4\\u55c5\\u55c6\\u55c7\\u55c8\\u55c9\\u55ca\\u55cb\\u55cc\\u55cd\\u55ce\\u55cf\\u55d0\\u55d1\\u55d2\\u55d3\\u55d4\\u55d5\\u55d6\\u55d7\\u55d8\\u55d9\\u55da\\u55db\\u55dc\\u55dd\\u55de\\u55df\\u55e0\\u55e1\\u55e2\\u55e3\\u55e4\\u55e5\\u55e6\\u55e7\\u55e8\\u55e9\\u55ea\\u55eb\\u55ec\\u55ed\\u55ee\\u55ef\\u55f0\\u55f1\\u55f2\\u55f3\\u55f4\\u55f5\\u55f6\\u55f7\\u55f8\\u55f9\\u55fa\\u55fb\\u55fc\\u55fd\\u55fe\\u55ff\\u5600\\u5601\\u5602\\u5603\\u5604\\u5605\\u5606\\u5607\\u5608\\u5609\\u560a\\u560b\\u560c\\u560d\\u560e\\u560f\\u5610\\u5611\\u5612\\u5613\\u5614\\u5615\\u5616\\u5617\\u5618\\u5619\\u561a\\u561b\\u561c\\u561d\\u561e\\u561f\\u5620\\u5621\\u5622\\u5623\\u5624\\u5625\\u5626\\u5627\\u5628\\u5629\\u562a\\u562b\\u562c\\u562d\\u562e\\u562f\\u5630\\u5631\\u5632\\u5633\\u5634\\u5635\\u5636\\u5637\\u5638\\u5639\\u563a\\u563b\\u563c\\u563d\\u563e\\u563f\\u5640\\u5641\\u5642\\u5643\\u5644\\u5645\\u5646\\u5647\\u5648\\u5649\\u564a\\u564b\\u564c\\u564d\\u564e\\u564f\\u5650\\u5651\\u5652\\u5653\\u5654\\u5655\\u5656\\u5657\\u5658\\u5659\\u565a\\u565b\\u565c\\u565d\\u565e\\u565f\\u5660\\u5661\\u5662\\u5663\\u5664\\u5665\\u5666\\u5667\\u5668\\u5669\\u566a\\u566b\\u566c\\u566d\\u566e\\u566f\\u5670\\u5671\\u5672\\u5673\\u5674\\u5675\\u5676\\u5677\\u5678\\u5679\\u567a\\u567b\\u567c\\u567d\\u567e\\u567f\\u5680\\u5681\\u5682\\u5683\\u5684\\u5685\\u5686\\u5687\\u5688\\u5689\\u568a\\u568b\\u568c\\u568d\\u568e\\u568f\\u5690\\u5691\\u5692\\u5693\\u5694\\u5695\\u5696\\u5697\\u5698\\u5699\\u569a\\u569b\\u569c\\u569d\\u569e\\u569f\\u56a0\\u56a1\\u56a2\\u56a3\\u56a4\\u56a5\\u56a6\\u56a7\\u56a8\\u56a9\\u56aa\\u56ab\\u56ac\\u56ad\\u56ae\\u56af\\u56b0\\u56b1\\u56b2\\u56b3\\u56b4\\u56b5\\u56b6\\u56b7\\u56b8\\u56b9\\u56ba\\u56bb\\u56bc\\u56bd\\u56be\\u56bf\\u56c0\\u56c1\\u56c2\\u56c3\\u56c4\\u56c5\\u56c6\\u56c7\\u56c8\\u56c9\\u56ca\\u56cb\\u56cc\\u56cd\\u56ce\\u56cf\\u56d0\\u56d1\\u56d2\\u56d3\\u56d4\\u56d5\\u56d6\\u56d7\\u56d8\\u56d9\\u56da\\u56db\\u56dc\\u56dd\\u56de\\u56df\\u56e0\\u56e1\\u56e2\\u56e3\\u56e4\\u56e5\\u56e6\\u56e7\\u56e8\\u56e9\\u56ea\\u56eb\\u56ec\\u56ed\\u56ee\\u56ef\\u56f0\\u56f1\\u56f2\\u56f3\\u56f4\\u56f5\\u56f6\\u56f7\\u56f8\\u56f9\\u56fa\\u56fb\\u56fc\\u56fd\\u56fe\\u56ff\\u5700\\u5701\\u5702\\u5703\\u5704\\u5705\\u5706\\u5707\\u5708\\u5709\\u570a\\u570b\\u570c\\u570d\\u570e\\u570f\\u5710\\u5711\\u5712\\u5713\\u5714\\u5715\\u5716\\u5717\\u5718\\u5719\\u571a\\u571b\\u571c\\u571d\\u571e\\u571f\\u5720\\u5721\\u5722\\u5723\\u5724\\u5725\\u5726\\u5727\\u5728\\u5729\\u572a\\u572b\\u572c\\u572d\\u572e\\u572f\\u5730\\u5731\\u5732\\u5733\\u5734\\u5735\\u5736\\u5737\\u5738\\u5739\\u573a\\u573b\\u573c\\u573d\\u573e\\u573f\\u5740\\u5741\\u5742\\u5743\\u5744\\u5745\\u5746\\u5747\\u5748\\u5749\\u574a\\u574b\\u574c\\u574d\\u574e\\u574f\\u5750\\u5751\\u5752\\u5753\\u5754\\u5755\\u5756\\u5757\\u5758\\u5759\\u575a\\u575b\\u575c\\u575d\\u575e\\u575f\\u5760\\u5761\\u5762\\u5763\\u5764\\u5765\\u5766\\u5767\\u5768\\u5769\\u576a\\u576b\\u576c\\u576d\\u576e\\u576f\\u5770\\u5771\\u5772\\u5773\\u5774\\u5775\\u5776\\u5777\\u5778\\u5779\\u577a\\u577b\\u577c\\u577d\\u577e\\u577f\\u5780\\u5781\\u5782\\u5783\\u5784\\u5785\\u5786\\u5787\\u5788\\u5789\\u578a\\u578b\\u578c\\u578d\\u578e\\u578f\\u5790\\u5791\\u5792\\u5793\\u5794\\u5795\\u5796\\u5797\\u5798\\u5799\\u579a\\u579b\\u579c\\u579d\\u579e\\u579f\\u57a0\\u57a1\\u57a2\\u57a3\\u57a4\\u57a5\\u57a6\\u57a7\\u57a8\\u57a9\\u57aa\\u57ab\\u57ac\\u57ad\\u57ae\\u57af\\u57b0\\u57b1\\u57b2\\u57b3\\u57b4\\u57b5\\u57b6\\u57b7\\u57b8\\u57b9\\u57ba\\u57bb\\u57bc\\u57bd\\u57be\\u57bf\\u57c0\\u57c1\\u57c2\\u57c3\\u57c4\\u57c5\\u57c6\\u57c7\\u57c8\\u57c9\\u57ca\\u57cb\\u57cc\\u57cd\\u57ce\\u57cf\\u57d0\\u57d1\\u57d2\\u57d3\\u57d4\\u57d5\\u57d6\\u57d7\\u57d8\\u57d9\\u57da\\u57db\\u57dc\\u57dd\\u57de\\u57df\\u57e0\\u57e1\\u57e2\\u57e3\\u57e4\\u57e5\\u57e6\\u57e7\\u57e8\\u57e9\\u57ea\\u57eb\\u57ec\\u57ed\\u57ee\\u57ef\\u57f0\\u57f1\\u57f2\\u57f3\\u57f4\\u57f5\\u57f6\\u57f7\\u57f8\\u57f9\\u57fa\\u57fb\\u57fc\\u57fd\\u57fe\\u57ff\\u5800\\u5801\\u5802\\u5803\\u5804\\u5805\\u5806\\u5807\\u5808\\u5809\\u580a\\u580b\\u580c\\u580d\\u580e\\u580f\\u5810\\u5811\\u5812\\u5813\\u5814\\u5815\\u5816\\u5817\\u5818\\u5819\\u581a\\u581b\\u581c\\u581d\\u581e\\u581f\\u5820\\u5821\\u5822\\u5823\\u5824\\u5825\\u5826\\u5827\\u5828\\u5829\\u582a\\u582b\\u582c\\u582d\\u582e\\u582f\\u5830\\u5831\\u5832\\u5833\\u5834\\u5835\\u5836\\u5837\\u5838\\u5839\\u583a\\u583b\\u583c\\u583d\\u583e\\u583f\\u5840\\u5841\\u5842\\u5843\\u5844\\u5845\\u5846\\u5847\\u5848\\u5849\\u584a\\u584b\\u584c\\u584d\\u584e\\u584f\\u5850\\u5851\\u5852\\u5853\\u5854\\u5855\\u5856\\u5857\\u5858\\u5859\\u585a\\u585b\\u585c\\u585d\\u585e\\u585f\\u5860\\u5861\\u5862\\u5863\\u5864\\u5865\\u5866\\u5867\\u5868\\u5869\\u586a\\u586b\\u586c\\u586d\\u586e\\u586f\\u5870\\u5871\\u5872\\u5873\\u5874\\u5875\\u5876\\u5877\\u5878\\u5879\\u587a\\u587b\\u587c\\u587d\\u587e\\u587f\\u5880\\u5881\\u5882\\u5883\\u5884\\u5885\\u5886\\u5887\\u5888\\u5889\\u588a\\u588b\\u588c\\u588d\\u588e\\u588f\\u5890\\u5891\\u5892\\u5893\\u5894\\u5895\\u5896\\u5897\\u5898\\u5899\\u589a\\u589b\\u589c\\u589d\\u589e\\u589f\\u58a0\\u58a1\\u58a2\\u58a3\\u58a4\\u58a5\\u58a6\\u58a7\\u58a8\\u58a9\\u58aa\\u58ab\\u58ac\\u58ad\\u58ae\\u58af\\u58b0\\u58b1\\u58b2\\u58b3\\u58b4\\u58b5\\u58b6\\u58b7\\u58b8\\u58b9\\u58ba\\u58bb\\u58bc\\u58bd\\u58be\\u58bf\\u58c0\\u58c1\\u58c2\\u58c3\\u58c4\\u58c5\\u58c6\\u58c7\\u58c8\\u58c9\\u58ca\\u58cb\\u58cc\\u58cd\\u58ce\\u58cf\\u58d0\\u58d1\\u58d2\\u58d3\\u58d4\\u58d5\\u58d6\\u58d7\\u58d8\\u58d9\\u58da\\u58db\\u58dc\\u58dd\\u58de\\u58df\\u58e0\\u58e1\\u58e2\\u58e3\\u58e4\\u58e5\\u58e6\\u58e7\\u58e8\\u58e9\\u58ea\\u58eb\\u58ec\\u58ed\\u58ee\\u58ef\\u58f0\\u58f1\\u58f2\\u58f3\\u58f4\\u58f5\\u58f6\\u58f7\\u58f8\\u58f9\\u58fa\\u58fb\\u58fc\\u58fd\\u58fe\\u58ff\\u5900\\u5901\\u5902\\u5903\\u5904\\u5905\\u5906\\u5907\\u5908\\u5909\\u590a\\u590b\\u590c\\u590d\\u590e\\u590f\\u5910\\u5911\\u5912\\u5913\\u5914\\u5915\\u5916\\u5917\\u5918\\u5919\\u591a\\u591b\\u591c\\u591d\\u591e\\u591f\\u5920\\u5921\\u5922\\u5923\\u5924\\u5925\\u5926\\u5927\\u5928\\u5929\\u592a\\u592b\\u592c\\u592d\\u592e\\u592f\\u5930\\u5931\\u5932\\u5933\\u5934\\u5935\\u5936\\u5937\\u5938\\u5939\\u593a\\u593b\\u593c\\u593d\\u593e\\u593f\\u5940\\u5941\\u5942\\u5943\\u5944\\u5945\\u5946\\u5947\\u5948\\u5949\\u594a\\u594b\\u594c\\u594d\\u594e\\u594f\\u5950\\u5951\\u5952\\u5953\\u5954\\u5955\\u5956\\u5957\\u5958\\u5959\\u595a\\u595b\\u595c\\u595d\\u595e\\u595f\\u5960\\u5961\\u5962\\u5963\\u5964\\u5965\\u5966\\u5967\\u5968\\u5969\\u596a\\u596b\\u596c\\u596d\\u596e\\u596f\\u5970\\u5971\\u5972\\u5973\\u5974\\u5975\\u5976\\u5977\\u5978\\u5979\\u597a\\u597b\\u597c\\u597d\\u597e\\u597f\\u5980\\u5981\\u5982\\u5983\\u5984\\u5985\\u5986\\u5987\\u5988\\u5989\\u598a\\u598b\\u598c\\u598d\\u598e\\u598f\\u5990\\u5991\\u5992\\u5993\\u5994\\u5995\\u5996\\u5997\\u5998\\u5999\\u599a\\u599b\\u599c\\u599d\\u599e\\u599f\\u59a0\\u59a1\\u59a2\\u59a3\\u59a4\\u59a5\\u59a6\\u59a7\\u59a8\\u59a9\\u59aa\\u59ab\\u59ac\\u59ad\\u59ae\\u59af\\u59b0\\u59b1\\u59b2\\u59b3\\u59b4\\u59b5\\u59b6\\u59b7\\u59b8\\u59b9\\u59ba\\u59bb\\u59bc\\u59bd\\u59be\\u59bf\\u59c0\\u59c1\\u59c2\\u59c3\\u59c4\\u59c5\\u59c6\\u59c7\\u59c8\\u59c9\\u59ca\\u59cb\\u59cc\\u59cd\\u59ce\\u59cf\\u59d0\\u59d1\\u59d2\\u59d3\\u59d4\\u59d5\\u59d6\\u59d7\\u59d8\\u59d9\\u59da\\u59db\\u59dc\\u59dd\\u59de\\u59df\\u59e0\\u59e1\\u59e2\\u59e3\\u59e4\\u59e5\\u59e6\\u59e7\\u59e8\\u59e9\\u59ea\\u59eb\\u59ec\\u59ed\\u59ee\\u59ef\\u59f0\\u59f1\\u59f2\\u59f3\\u59f4\\u59f5\\u59f6\\u59f7\\u59f8\\u59f9\\u59fa\\u59fb\\u59fc\\u59fd\\u59fe\\u59ff\\u5a00\\u5a01\\u5a02\\u5a03\\u5a04\\u5a05\\u5a06\\u5a07\\u5a08\\u5a09\\u5a0a\\u5a0b\\u5a0c\\u5a0d\\u5a0e\\u5a0f\\u5a10\\u5a11\\u5a12\\u5a13\\u5a14\\u5a15\\u5a16\\u5a17\\u5a18\\u5a19\\u5a1a\\u5a1b\\u5a1c\\u5a1d\\u5a1e\\u5a1f\\u5a20\\u5a21\\u5a22\\u5a23\\u5a24\\u5a25\\u5a26\\u5a27\\u5a28\\u5a29\\u5a2a\\u5a2b\\u5a2c\\u5a2d\\u5a2e\\u5a2f\\u5a30\\u5a31\\u5a32\\u5a33\\u5a34\\u5a35\\u5a36\\u5a37\\u5a38\\u5a39\\u5a3a\\u5a3b\\u5a3c\\u5a3d\\u5a3e\\u5a3f\\u5a40\\u5a41\\u5a42\\u5a43\\u5a44\\u5a45\\u5a46\\u5a47\\u5a48\\u5a49\\u5a4a\\u5a4b\\u5a4c\\u5a4d\\u5a4e\\u5a4f\\u5a50\\u5a51\\u5a52\\u5a53\\u5a54\\u5a55\\u5a56\\u5a57\\u5a58\\u5a59\\u5a5a\\u5a5b\\u5a5c\\u5a5d\\u5a5e\\u5a5f\\u5a60\\u5a61\\u5a62\\u5a63\\u5a64\\u5a65\\u5a66\\u5a67\\u5a68\\u5a69\\u5a6a\\u5a6b\\u5a6c\\u5a6d\\u5a6e\\u5a6f\\u5a70\\u5a71\\u5a72\\u5a73\\u5a74\\u5a75\\u5a76\\u5a77\\u5a78\\u5a79\\u5a7a\\u5a7b\\u5a7c\\u5a7d\\u5a7e\\u5a7f\\u5a80\\u5a81\\u5a82\\u5a83\\u5a84\\u5a85\\u5a86\\u5a87\\u5a88\\u5a89\\u5a8a\\u5a8b\\u5a8c\\u5a8d\\u5a8e\\u5a8f\\u5a90\\u5a91\\u5a92\\u5a93\\u5a94\\u5a95\\u5a96\\u5a97\\u5a98\\u5a99\\u5a9a\\u5a9b\\u5a9c\\u5a9d\\u5a9e\\u5a9f\\u5aa0\\u5aa1\\u5aa2\\u5aa3\\u5aa4\\u5aa5\\u5aa6\\u5aa7\\u5aa8\\u5aa9\\u5aaa\\u5aab\\u5aac\\u5aad\\u5aae\\u5aaf\\u5ab0\\u5ab1\\u5ab2\\u5ab3\\u5ab4\\u5ab5\\u5ab6\\u5ab7\\u5ab8\\u5ab9\\u5aba\\u5abb\\u5abc\\u5abd\\u5abe\\u5abf\\u5ac0\\u5ac1\\u5ac2\\u5ac3\\u5ac4\\u5ac5\\u5ac6\\u5ac7\\u5ac8\\u5ac9\\u5aca\\u5acb\\u5acc\\u5acd\\u5ace\\u5acf\\u5ad0\\u5ad1\\u5ad2\\u5ad3\\u5ad4\\u5ad5\\u5ad6\\u5ad7\\u5ad8\\u5ad9\\u5ada\\u5adb\\u5adc\\u5add\\u5ade\\u5adf\\u5ae0\\u5ae1\\u5ae2\\u5ae3\\u5ae4\\u5ae5\\u5ae6\\u5ae7\\u5ae8\\u5ae9\\u5aea\\u5aeb\\u5aec\\u5aed\\u5aee\\u5aef\\u5af0\\u5af1\\u5af2\\u5af3\\u5af4\\u5af5\\u5af6\\u5af7\\u5af8\\u5af9\\u5afa\\u5afb\\u5afc\\u5afd\\u5afe\\u5aff\\u5b00\\u5b01\\u5b02\\u5b03\\u5b04\\u5b05\\u5b06\\u5b07\\u5b08\\u5b09\\u5b0a\\u5b0b\\u5b0c\\u5b0d\\u5b0e\\u5b0f\\u5b10\\u5b11\\u5b12\\u5b13\\u5b14\\u5b15\\u5b16\\u5b17\\u5b18\\u5b19\\u5b1a\\u5b1b\\u5b1c\\u5b1d\\u5b1e\\u5b1f\\u5b20\\u5b21\\u5b22\\u5b23\\u5b24\\u5b25\\u5b26\\u5b27\\u5b28\\u5b29\\u5b2a\\u5b2b\\u5b2c\\u5b2d\\u5b2e\\u5b2f\\u5b30\\u5b31\\u5b32\\u5b33\\u5b34\\u5b35\\u5b36\\u5b37\\u5b38\\u5b39\\u5b3a\\u5b3b\\u5b3c\\u5b3d\\u5b3e\\u5b3f\\u5b40\\u5b41\\u5b42\\u5b43\\u5b44\\u5b45\\u5b46\\u5b47\\u5b48\\u5b49\\u5b4a\\u5b4b\\u5b4c\\u5b4d\\u5b4e\\u5b4f\\u5b50\\u5b51\\u5b52\\u5b53\\u5b54\\u5b55\\u5b56\\u5b57\\u5b58\\u5b59\\u5b5a\\u5b5b\\u5b5c\\u5b5d\\u5b5e\\u5b5f\\u5b60\\u5b61\\u5b62\\u5b63\\u5b64\\u5b65\\u5b66\\u5b67\\u5b68\\u5b69\\u5b6a\\u5b6b\\u5b6c\\u5b6d\\u5b6e\\u5b6f\\u5b70\\u5b71\\u5b72\\u5b73\\u5b74\\u5b75\\u5b76\\u5b77\\u5b78\\u5b79\\u5b7a\\u5b7b\\u5b7c\\u5b7d\\u5b7e\\u5b7f\\u5b80\\u5b81\\u5b82\\u5b83\\u5b84\\u5b85\\u5b86\\u5b87\\u5b88\\u5b89\\u5b8a\\u5b8b\\u5b8c\\u5b8d\\u5b8e\\u5b8f\\u5b90\\u5b91\\u5b92\\u5b93\\u5b94\\u5b95\\u5b96\\u5b97\\u5b98\\u5b99\\u5b9a\\u5b9b\\u5b9c\\u5b9d\\u5b9e\\u5b9f\\u5ba0\\u5ba1\\u5ba2\\u5ba3\\u5ba4\\u5ba5\\u5ba6\\u5ba7\\u5ba8\\u5ba9\\u5baa\\u5bab\\u5bac\\u5bad\\u5bae\\u5baf\\u5bb0\\u5bb1\\u5bb2\\u5bb3\\u5bb4\\u5bb5\\u5bb6\\u5bb7\\u5bb8\\u5bb9\\u5bba\\u5bbb\\u5bbc\\u5bbd\\u5bbe\\u5bbf\\u5bc0\\u5bc1\\u5bc2\\u5bc3\\u5bc4\\u5bc5\\u5bc6\\u5bc7\\u5bc8\\u5bc9\\u5bca\\u5bcb\\u5bcc\\u5bcd\\u5bce\\u5bcf\\u5bd0\\u5bd1\\u5bd2\\u5bd3\\u5bd4\\u5bd5\\u5bd6\\u5bd7\\u5bd8\\u5bd9\\u5bda\\u5bdb\\u5bdc\\u5bdd\\u5bde\\u5bdf\\u5be0\\u5be1\\u5be2\\u5be3\\u5be4\\u5be5\\u5be6\\u5be7\\u5be8\\u5be9\\u5bea\\u5beb\\u5bec\\u5bed\\u5bee\\u5bef\\u5bf0\\u5bf1\\u5bf2\\u5bf3\\u5bf4\\u5bf5\\u5bf6\\u5bf7\\u5bf8\\u5bf9\\u5bfa\\u5bfb\\u5bfc\\u5bfd\\u5bfe\\u5bff\\u5c00\\u5c01\\u5c02\\u5c03\\u5c04\\u5c05\\u5c06\\u5c07\\u5c08\\u5c09\\u5c0a\\u5c0b\\u5c0c\\u5c0d\\u5c0e\\u5c0f\\u5c10\\u5c11\\u5c12\\u5c13\\u5c14\\u5c15\\u5c16\\u5c17\\u5c18\\u5c19\\u5c1a\\u5c1b\\u5c1c\\u5c1d\\u5c1e\\u5c1f\\u5c20\\u5c21\\u5c22\\u5c23\\u5c24\\u5c25\\u5c26\\u5c27\\u5c28\\u5c29\\u5c2a\\u5c2b\\u5c2c\\u5c2d\\u5c2e\\u5c2f\\u5c30\\u5c31\\u5c32\\u5c33\\u5c34\\u5c35\\u5c36\\u5c37\\u5c38\\u5c39\\u5c3a\\u5c3b\\u5c3c\\u5c3d\\u5c3e\\u5c3f\\u5c40\\u5c41\\u5c42\\u5c43\\u5c44\\u5c45\\u5c46\\u5c47\\u5c48\\u5c49\\u5c4a\\u5c4b\\u5c4c\\u5c4d\\u5c4e\\u5c4f\\u5c50\\u5c51\\u5c52\\u5c53\\u5c54\\u5c55\\u5c56\\u5c57\\u5c58\\u5c59\\u5c5a\\u5c5b\\u5c5c\\u5c5d\\u5c5e\\u5c5f\\u5c60\\u5c61\\u5c62\\u5c63\\u5c64\\u5c65\\u5c66\\u5c67\\u5c68\\u5c69\\u5c6a\\u5c6b\\u5c6c\\u5c6d\\u5c6e\\u5c6f\\u5c70\\u5c71\\u5c72\\u5c73\\u5c74\\u5c75\\u5c76\\u5c77\\u5c78\\u5c79\\u5c7a\\u5c7b\\u5c7c\\u5c7d\\u5c7e\\u5c7f\\u5c80\\u5c81\\u5c82\\u5c83\\u5c84\\u5c85\\u5c86\\u5c87\\u5c88\\u5c89\\u5c8a\\u5c8b\\u5c8c\\u5c8d\\u5c8e\\u5c8f\\u5c90\\u5c91\\u5c92\\u5c93\\u5c94\\u5c95\\u5c96\\u5c97\\u5c98\\u5c99\\u5c9a\\u5c9b\\u5c9c\\u5c9d\\u5c9e\\u5c9f\\u5ca0\\u5ca1\\u5ca2\\u5ca3\\u5ca4\\u5ca5\\u5ca6\\u5ca7\\u5ca8\\u5ca9\\u5caa\\u5cab\\u5cac\\u5cad\\u5cae\\u5caf\\u5cb0\\u5cb1\\u5cb2\\u5cb3\\u5cb4\\u5cb5\\u5cb6\\u5cb7\\u5cb8\\u5cb9\\u5cba\\u5cbb\\u5cbc\\u5cbd\\u5cbe\\u5cbf\\u5cc0\\u5cc1\\u5cc2\\u5cc3\\u5cc4\\u5cc5\\u5cc6\\u5cc7\\u5cc8\\u5cc9\\u5cca\\u5ccb\\u5ccc\\u5ccd\\u5cce\\u5ccf\\u5cd0\\u5cd1\\u5cd2\\u5cd3\\u5cd4\\u5cd5\\u5cd6\\u5cd7\\u5cd8\\u5cd9\\u5cda\\u5cdb\\u5cdc\\u5cdd\\u5cde\\u5cdf\\u5ce0\\u5ce1\\u5ce2\\u5ce3\\u5ce4\\u5ce5\\u5ce6\\u5ce7\\u5ce8\\u5ce9\\u5cea\\u5ceb\\u5cec\\u5ced\\u5cee\\u5cef\\u5cf0\\u5cf1\\u5cf2\\u5cf3\\u5cf4\\u5cf5\\u5cf6\\u5cf7\\u5cf8\\u5cf9\\u5cfa\\u5cfb\\u5cfc\\u5cfd\\u5cfe\\u5cff\\u5d00\\u5d01\\u5d02\\u5d03\\u5d04\\u5d05\\u5d06\\u5d07\\u5d08\\u5d09\\u5d0a\\u5d0b\\u5d0c\\u5d0d\\u5d0e\\u5d0f\\u5d10\\u5d11\\u5d12\\u5d13\\u5d14\\u5d15\\u5d16\\u5d17\\u5d18\\u5d19\\u5d1a\\u5d1b\\u5d1c\\u5d1d\\u5d1e\\u5d1f\\u5d20\\u5d21\\u5d22\\u5d23\\u5d24\\u5d25\\u5d26\\u5d27\\u5d28\\u5d29\\u5d2a\\u5d2b\\u5d2c\\u5d2d\\u5d2e\\u5d2f\\u5d30\\u5d31\\u5d32\\u5d33\\u5d34\\u5d35\\u5d36\\u5d37\\u5d38\\u5d39\\u5d3a\\u5d3b\\u5d3c\\u5d3d\\u5d3e\\u5d3f\\u5d40\\u5d41\\u5d42\\u5d43\\u5d44\\u5d45\\u5d46\\u5d47\\u5d48\\u5d49\\u5d4a\\u5d4b\\u5d4c\\u5d4d\\u5d4e\\u5d4f\\u5d50\\u5d51\\u5d52\\u5d53\\u5d54\\u5d55\\u5d56\\u5d57\\u5d58\\u5d59\\u5d5a\\u5d5b\\u5d5c\\u5d5d\\u5d5e\\u5d5f\\u5d60\\u5d61\\u5d62\\u5d63\\u5d64\\u5d65\\u5d66\\u5d67\\u5d68\\u5d69\\u5d6a\\u5d6b\\u5d6c\\u5d6d\\u5d6e\\u5d6f\\u5d70\\u5d71\\u5d72\\u5d73\\u5d74\\u5d75\\u5d76\\u5d77\\u5d78\\u5d79\\u5d7a\\u5d7b\\u5d7c\\u5d7d\\u5d7e\\u5d7f\\u5d80\\u5d81\\u5d82\\u5d83\\u5d84\\u5d85\\u5d86\\u5d87\\u5d88\\u5d89\\u5d8a\\u5d8b\\u5d8c\\u5d8d\\u5d8e\\u5d8f\\u5d90\\u5d91\\u5d92\\u5d93\\u5d94\\u5d95\\u5d96\\u5d97\\u5d98\\u5d99\\u5d9a\\u5d9b\\u5d9c\\u5d9d\\u5d9e\\u5d9f\\u5da0\\u5da1\\u5da2\\u5da3\\u5da4\\u5da5\\u5da6\\u5da7\\u5da8\\u5da9\\u5daa\\u5dab\\u5dac\\u5dad\\u5dae\\u5daf\\u5db0\\u5db1\\u5db2\\u5db3\\u5db4\\u5db5\\u5db6\\u5db7\\u5db8\\u5db9\\u5dba\\u5dbb\\u5dbc\\u5dbd\\u5dbe\\u5dbf\\u5dc0\\u5dc1\\u5dc2\\u5dc3\\u5dc4\\u5dc5\\u5dc6\\u5dc7\\u5dc8\\u5dc9\\u5dca\\u5dcb\\u5dcc\\u5dcd\\u5dce\\u5dcf\\u5dd0\\u5dd1\\u5dd2\\u5dd3\\u5dd4\\u5dd5\\u5dd6\\u5dd7\\u5dd8\\u5dd9\\u5dda\\u5ddb\\u5ddc\\u5ddd\\u5dde\\u5ddf\\u5de0\\u5de1\\u5de2\\u5de3\\u5de4\\u5de5\\u5de6\\u5de7\\u5de8\\u5de9\\u5dea\\u5deb\\u5dec\\u5ded\\u5dee\\u5def\\u5df0\\u5df1\\u5df2\\u5df3\\u5df4\\u5df5\\u5df6\\u5df7\\u5df8\\u5df9\\u5dfa\\u5dfb\\u5dfc\\u5dfd\\u5dfe\\u5dff\\u5e00\\u5e01\\u5e02\\u5e03\\u5e04\\u5e05\\u5e06\\u5e07\\u5e08\\u5e09\\u5e0a\\u5e0b\\u5e0c\\u5e0d\\u5e0e\\u5e0f\\u5e10\\u5e11\\u5e12\\u5e13\\u5e14\\u5e15\\u5e16\\u5e17\\u5e18\\u5e19\\u5e1a\\u5e1b\\u5e1c\\u5e1d\\u5e1e\\u5e1f\\u5e20\\u5e21\\u5e22\\u5e23\\u5e24\\u5e25\\u5e26\\u5e27\\u5e28\\u5e29\\u5e2a\\u5e2b\\u5e2c\\u5e2d\\u5e2e\\u5e2f\\u5e30\\u5e31\\u5e32\\u5e33\\u5e34\\u5e35\\u5e36\\u5e37\\u5e38\\u5e39\\u5e3a\\u5e3b\\u5e3c\\u5e3d\\u5e3e\\u5e3f\\u5e40\\u5e41\\u5e42\\u5e43\\u5e44\\u5e45\\u5e46\\u5e47\\u5e48\\u5e49\\u5e4a\\u5e4b\\u5e4c\\u5e4d\\u5e4e\\u5e4f\\u5e50\\u5e51\\u5e52\\u5e53\\u5e54\\u5e55\\u5e56\\u5e57\\u5e58\\u5e59\\u5e5a\\u5e5b\\u5e5c\\u5e5d\\u5e5e\\u5e5f\\u5e60\\u5e61\\u5e62\\u5e63\\u5e64\\u5e65\\u5e66\\u5e67\\u5e68\\u5e69\\u5e6a\\u5e6b\\u5e6c\\u5e6d\\u5e6e\\u5e6f\\u5e70\\u5e71\\u5e72\\u5e73\\u5e74\\u5e75\\u5e76\\u5e77\\u5e78\\u5e79\\u5e7a\\u5e7b\\u5e7c\\u5e7d\\u5e7e\\u5e7f\\u5e80\\u5e81\\u5e82\\u5e83\\u5e84\\u5e85\\u5e86\\u5e87\\u5e88\\u5e89\\u5e8a\\u5e8b\\u5e8c\\u5e8d\\u5e8e\\u5e8f\\u5e90\\u5e91\\u5e92\\u5e93\\u5e94\\u5e95\\u5e96\\u5e97\\u5e98\\u5e99\\u5e9a\\u5e9b\\u5e9c\\u5e9d\\u5e9e\\u5e9f\\u5ea0\\u5ea1\\u5ea2\\u5ea3\\u5ea4\\u5ea5\\u5ea6\\u5ea7\\u5ea8\\u5ea9\\u5eaa\\u5eab\\u5eac\\u5ead\\u5eae\\u5eaf\\u5eb0\\u5eb1\\u5eb2\\u5eb3\\u5eb4\\u5eb5\\u5eb6\\u5eb7\\u5eb8\\u5eb9\\u5eba\\u5ebb\\u5ebc\\u5ebd\\u5ebe\\u5ebf\\u5ec0\\u5ec1\\u5ec2\\u5ec3\\u5ec4\\u5ec5\\u5ec6\\u5ec7\\u5ec8\\u5ec9\\u5eca\\u5ecb\\u5ecc\\u5ecd\\u5ece\\u5ecf\\u5ed0\\u5ed1\\u5ed2\\u5ed3\\u5ed4\\u5ed5\\u5ed6\\u5ed7\\u5ed8\\u5ed9\\u5eda\\u5edb\\u5edc\\u5edd\\u5ede\\u5edf\\u5ee0\\u5ee1\\u5ee2\\u5ee3\\u5ee4\\u5ee5\\u5ee6\\u5ee7\\u5ee8\\u5ee9\\u5eea\\u5eeb\\u5eec\\u5eed\\u5eee\\u5eef\\u5ef0\\u5ef1\\u5ef2\\u5ef3\\u5ef4\\u5ef5\\u5ef6\\u5ef7\\u5ef8\\u5ef9\\u5efa\\u5efb\\u5efc\\u5efd\\u5efe\\u5eff\\u5f00\\u5f01\\u5f02\\u5f03\\u5f04\\u5f05\\u5f06\\u5f07\\u5f08\\u5f09\\u5f0a\\u5f0b\\u5f0c\\u5f0d\\u5f0e\\u5f0f\\u5f10\\u5f11\\u5f12\\u5f13\\u5f14\\u5f15\\u5f16\\u5f17\\u5f18\\u5f19\\u5f1a\\u5f1b\\u5f1c\\u5f1d\\u5f1e\\u5f1f\\u5f20\\u5f21\\u5f22\\u5f23\\u5f24\\u5f25\\u5f26\\u5f27\\u5f28\\u5f29\\u5f2a\\u5f2b\\u5f2c\\u5f2d\\u5f2e\\u5f2f\\u5f30\\u5f31\\u5f32\\u5f33\\u5f34\\u5f35\\u5f36\\u5f37\\u5f38\\u5f39\\u5f3a\\u5f3b\\u5f3c\\u5f3d\\u5f3e\\u5f3f\\u5f40\\u5f41\\u5f42\\u5f43\\u5f44\\u5f45\\u5f46\\u5f47\\u5f48\\u5f49\\u5f4a\\u5f4b\\u5f4c\\u5f4d\\u5f4e\\u5f4f\\u5f50\\u5f51\\u5f52\\u5f53\\u5f54\\u5f55\\u5f56\\u5f57\\u5f58\\u5f59\\u5f5a\\u5f5b\\u5f5c\\u5f5d\\u5f5e\\u5f5f\\u5f60\\u5f61\\u5f62\\u5f63\\u5f64\\u5f65\\u5f66\\u5f67\\u5f68\\u5f69\\u5f6a\\u5f6b\\u5f6c\\u5f6d\\u5f6e\\u5f6f\\u5f70\\u5f71\\u5f72\\u5f73\\u5f74\\u5f75\\u5f76\\u5f77\\u5f78\\u5f79\\u5f7a\\u5f7b\\u5f7c\\u5f7d\\u5f7e\\u5f7f\\u5f80\\u5f81\\u5f82\\u5f83\\u5f84\\u5f85\\u5f86\\u5f87\\u5f88\\u5f89\\u5f8a\\u5f8b\\u5f8c\\u5f8d\\u5f8e\\u5f8f\\u5f90\\u5f91\\u5f92\\u5f93\\u5f94\\u5f95\\u5f96\\u5f97\\u5f98\\u5f99\\u5f9a\\u5f9b\\u5f9c\\u5f9d\\u5f9e\\u5f9f\\u5fa0\\u5fa1\\u5fa2\\u5fa3\\u5fa4\\u5fa5\\u5fa6\\u5fa7\\u5fa8\\u5fa9\\u5faa\\u5fab\\u5fac\\u5fad\\u5fae\\u5faf\\u5fb0\\u5fb1\\u5fb2\\u5fb3\\u5fb4\\u5fb5\\u5fb6\\u5fb7\\u5fb8\\u5fb9\\u5fba\\u5fbb\\u5fbc\\u5fbd\\u5fbe\\u5fbf\\u5fc0\\u5fc1\\u5fc2\\u5fc3\\u5fc4\\u5fc5\\u5fc6\\u5fc7\\u5fc8\\u5fc9\\u5fca\\u5fcb\\u5fcc\\u5fcd\\u5fce\\u5fcf\\u5fd0\\u5fd1\\u5fd2\\u5fd3\\u5fd4\\u5fd5\\u5fd6\\u5fd7\\u5fd8\\u5fd9\\u5fda\\u5fdb\\u5fdc\\u5fdd\\u5fde\\u5fdf\\u5fe0\\u5fe1\\u5fe2\\u5fe3\\u5fe4\\u5fe5\\u5fe6\\u5fe7\\u5fe8\\u5fe9\\u5fea\\u5feb\\u5fec\\u5fed\\u5fee\\u5fef\\u5ff0\\u5ff1\\u5ff2\\u5ff3\\u5ff4\\u5ff5\\u5ff6\\u5ff7\\u5ff8\\u5ff9\\u5ffa\\u5ffb\\u5ffc\\u5ffd\\u5ffe\\u5fff\\u6000\\u6001\\u6002\\u6003\\u6004\\u6005\\u6006\\u6007\\u6008\\u6009\\u600a\\u600b\\u600c\\u600d\\u600e\\u600f\\u6010\\u6011\\u6012\\u6013\\u6014\\u6015\\u6016\\u6017\\u6018\\u6019\\u601a\\u601b\\u601c\\u601d\\u601e\\u601f\\u6020\\u6021\\u6022\\u6023\\u6024\\u6025\\u6026\\u6027\\u6028\\u6029\\u602a\\u602b\\u602c\\u602d\\u602e\\u602f\\u6030\\u6031\\u6032\\u6033\\u6034\\u6035\\u6036\\u6037\\u6038\\u6039\\u603a\\u603b\\u603c\\u603d\\u603e\\u603f\\u6040\\u6041\\u6042\\u6043\\u6044\\u6045\\u6046\\u6047\\u6048\\u6049\\u604a\\u604b\\u604c\\u604d\\u604e\\u604f\\u6050\\u6051\\u6052\\u6053\\u6054\\u6055\\u6056\\u6057\\u6058\\u6059\\u605a\\u605b\\u605c\\u605d\\u605e\\u605f\\u6060\\u6061\\u6062\\u6063\\u6064\\u6065\\u6066\\u6067\\u6068\\u6069\\u606a\\u606b\\u606c\\u606d\\u606e\\u606f\\u6070\\u6071\\u6072\\u6073\\u6074\\u6075\\u6076\\u6077\\u6078\\u6079\\u607a\\u607b\\u607c\\u607d\\u607e\\u607f\\u6080\\u6081\\u6082\\u6083\\u6084\\u6085\\u6086\\u6087\\u6088\\u6089\\u608a\\u608b\\u608c\\u608d\\u608e\\u608f\\u6090\\u6091\\u6092\\u6093\\u6094\\u6095\\u6096\\u6097\\u6098\\u6099\\u609a\\u609b\\u609c\\u609d\\u609e\\u609f\\u60a0\\u60a1\\u60a2\\u60a3\\u60a4\\u60a5\\u60a6\\u60a7\\u60a8\\u60a9\\u60aa\\u60ab\\u60ac\\u60ad\\u60ae\\u60af\\u60b0\\u60b1\\u60b2\\u60b3\\u60b4\\u60b5\\u60b6\\u60b7\\u60b8\\u60b9\\u60ba\\u60bb\\u60bc\\u60bd\\u60be\\u60bf\\u60c0\\u60c1\\u60c2\\u60c3\\u60c4\\u60c5\\u60c6\\u60c7\\u60c8\\u60c9\\u60ca\\u60cb\\u60cc\\u60cd\\u60ce\\u60cf\\u60d0\\u60d1\\u60d2\\u60d3\\u60d4\\u60d5\\u60d6\\u60d7\\u60d8\\u60d9\\u60da\\u60db\\u60dc\\u60dd\\u60de\\u60df\\u60e0\\u60e1\\u60e2\\u60e3\\u60e4\\u60e5\\u60e6\\u60e7\\u60e8\\u60e9\\u60ea\\u60eb\\u60ec\\u60ed\\u60ee\\u60ef\\u60f0\\u60f1\\u60f2\\u60f3\\u60f4\\u60f5\\u60f6\\u60f7\\u60f8\\u60f9\\u60fa\\u60fb\\u60fc\\u60fd\\u60fe\\u60ff\\u6100\\u6101\\u6102\\u6103\\u6104\\u6105\\u6106\\u6107\\u6108\\u6109\\u610a\\u610b\\u610c\\u610d\\u610e\\u610f\\u6110\\u6111\\u6112\\u6113\\u6114\\u6115\\u6116\\u6117\\u6118\\u6119\\u611a\\u611b\\u611c\\u611d\\u611e\\u611f\\u6120\\u6121\\u6122\\u6123\\u6124\\u6125\\u6126\\u6127\\u6128\\u6129\\u612a\\u612b\\u612c\\u612d\\u612e\\u612f\\u6130\\u6131\\u6132\\u6133\\u6134\\u6135\\u6136\\u6137\\u6138\\u6139\\u613a\\u613b\\u613c\\u613d\\u613e\\u613f\\u6140\\u6141\\u6142\\u6143\\u6144\\u6145\\u6146\\u6147\\u6148\\u6149\\u614a\\u614b\\u614c\\u614d\\u614e\\u614f\\u6150\\u6151\\u6152\\u6153\\u6154\\u6155\\u6156\\u6157\\u6158\\u6159\\u615a\\u615b\\u615c\\u615d\\u615e\\u615f\\u6160\\u6161\\u6162\\u6163\\u6164\\u6165\\u6166\\u6167\\u6168\\u6169\\u616a\\u616b\\u616c\\u616d\\u616e\\u616f\\u6170\\u6171\\u6172\\u6173\\u6174\\u6175\\u6176\\u6177\\u6178\\u6179\\u617a\\u617b\\u617c\\u617d\\u617e\\u617f\\u6180\\u6181\\u6182\\u6183\\u6184\\u6185\\u6186\\u6187\\u6188\\u6189\\u618a\\u618b\\u618c\\u618d\\u618e\\u618f\\u6190\\u6191\\u6192\\u6193\\u6194\\u6195\\u6196\\u6197\\u6198\\u6199\\u619a\\u619b\\u619c\\u619d\\u619e\\u619f\\u61a0\\u61a1\\u61a2\\u61a3\\u61a4\\u61a5\\u61a6\\u61a7\\u61a8\\u61a9\\u61aa\\u61ab\\u61ac\\u61ad\\u61ae\\u61af\\u61b0\\u61b1\\u61b2\\u61b3\\u61b4\\u61b5\\u61b6\\u61b7\\u61b8\\u61b9\\u61ba\\u61bb\\u61bc\\u61bd\\u61be\\u61bf\\u61c0\\u61c1\\u61c2\\u61c3\\u61c4\\u61c5\\u61c6\\u61c7\\u61c8\\u61c9\\u61ca\\u61cb\\u61cc\\u61cd\\u61ce\\u61cf\\u61d0\\u61d1\\u61d2\\u61d3\\u61d4\\u61d5\\u61d6\\u61d7\\u61d8\\u61d9\\u61da\\u61db\\u61dc\\u61dd\\u61de\\u61df\\u61e0\\u61e1\\u61e2\\u61e3\\u61e4\\u61e5\\u61e6\\u61e7\\u61e8\\u61e9\\u61ea\\u61eb\\u61ec\\u61ed\\u61ee\\u61ef\\u61f0\\u61f1\\u61f2\\u61f3\\u61f4\\u61f5\\u61f6\\u61f7\\u61f8\\u61f9\\u61fa\\u61fb\\u61fc\\u61fd\\u61fe\\u61ff\\u6200\\u6201\\u6202\\u6203\\u6204\\u6205\\u6206\\u6207\\u6208\\u6209\\u620a\\u620b\\u620c\\u620d\\u620e\\u620f\\u6210\\u6211\\u6212\\u6213\\u6214\\u6215\\u6216\\u6217\\u6218\\u6219\\u621a\\u621b\\u621c\\u621d\\u621e\\u621f\\u6220\\u6221\\u6222\\u6223\\u6224\\u6225\\u6226\\u6227\\u6228\\u6229\\u622a\\u622b\\u622c\\u622d\\u622e\\u622f\\u6230\\u6231\\u6232\\u6233\\u6234\\u6235\\u6236\\u6237\\u6238\\u6239\\u623a\\u623b\\u623c\\u623d\\u623e\\u623f\\u6240\\u6241\\u6242\\u6243\\u6244\\u6245\\u6246\\u6247\\u6248\\u6249\\u624a\\u624b\\u624c\\u624d\\u624e\\u624f\\u6250\\u6251\\u6252\\u6253\\u6254\\u6255\\u6256\\u6257\\u6258\\u6259\\u625a\\u625b\\u625c\\u625d\\u625e\\u625f\\u6260\\u6261\\u6262\\u6263\\u6264\\u6265\\u6266\\u6267\\u6268\\u6269\\u626a\\u626b\\u626c\\u626d\\u626e\\u626f\\u6270\\u6271\\u6272\\u6273\\u6274\\u6275\\u6276\\u6277\\u6278\\u6279\\u627a\\u627b\\u627c\\u627d\\u627e\\u627f\\u6280\\u6281\\u6282\\u6283\\u6284\\u6285\\u6286\\u6287\\u6288\\u6289\\u628a\\u628b\\u628c\\u628d\\u628e\\u628f\\u6290\\u6291\\u6292\\u6293\\u6294\\u6295\\u6296\\u6297\\u6298\\u6299\\u629a\\u629b\\u629c\\u629d\\u629e\\u629f\\u62a0\\u62a1\\u62a2\\u62a3\\u62a4\\u62a5\\u62a6\\u62a7\\u62a8\\u62a9\\u62aa\\u62ab\\u62ac\\u62ad\\u62ae\\u62af\\u62b0\\u62b1\\u62b2\\u62b3\\u62b4\\u62b5\\u62b6\\u62b7\\u62b8\\u62b9\\u62ba\\u62bb\\u62bc\\u62bd\\u62be\\u62bf\\u62c0\\u62c1\\u62c2\\u62c3\\u62c4\\u62c5\\u62c6\\u62c7\\u62c8\\u62c9\\u62ca\\u62cb\\u62cc\\u62cd\\u62ce\\u62cf\\u62d0\\u62d1\\u62d2\\u62d3\\u62d4\\u62d5\\u62d6\\u62d7\\u62d8\\u62d9\\u62da\\u62db\\u62dc\\u62dd\\u62de\\u62df\\u62e0\\u62e1\\u62e2\\u62e3\\u62e4\\u62e5\\u62e6\\u62e7\\u62e8\\u62e9\\u62ea\\u62eb\\u62ec\\u62ed\\u62ee\\u62ef\\u62f0\\u62f1\\u62f2\\u62f3\\u62f4\\u62f5\\u62f6\\u62f7\\u62f8\\u62f9\\u62fa\\u62fb\\u62fc\\u62fd\\u62fe\\u62ff\\u6300\\u6301\\u6302\\u6303\\u6304\\u6305\\u6306\\u6307\\u6308\\u6309\\u630a\\u630b\\u630c\\u630d\\u630e\\u630f\\u6310\\u6311\\u6312\\u6313\\u6314\\u6315\\u6316\\u6317\\u6318\\u6319\\u631a\\u631b\\u631c\\u631d\\u631e\\u631f\\u6320\\u6321\\u6322\\u6323\\u6324\\u6325\\u6326\\u6327\\u6328\\u6329\\u632a\\u632b\\u632c\\u632d\\u632e\\u632f\\u6330\\u6331\\u6332\\u6333\\u6334\\u6335\\u6336\\u6337\\u6338\\u6339\\u633a\\u633b\\u633c\\u633d\\u633e\\u633f\\u6340\\u6341\\u6342\\u6343\\u6344\\u6345\\u6346\\u6347\\u6348\\u6349\\u634a\\u634b\\u634c\\u634d\\u634e\\u634f\\u6350\\u6351\\u6352\\u6353\\u6354\\u6355\\u6356\\u6357\\u6358\\u6359\\u635a\\u635b\\u635c\\u635d\\u635e\\u635f\\u6360\\u6361\\u6362\\u6363\\u6364\\u6365\\u6366\\u6367\\u6368\\u6369\\u636a\\u636b\\u636c\\u636d\\u636e\\u636f\\u6370\\u6371\\u6372\\u6373\\u6374\\u6375\\u6376\\u6377\\u6378\\u6379\\u637a\\u637b\\u637c\\u637d\\u637e\\u637f\\u6380\\u6381\\u6382\\u6383\\u6384\\u6385\\u6386\\u6387\\u6388\\u6389\\u638a\\u638b\\u638c\\u638d\\u638e\\u638f\\u6390\\u6391\\u6392\\u6393\\u6394\\u6395\\u6396\\u6397\\u6398\\u6399\\u639a\\u639b\\u639c\\u639d\\u639e\\u639f\\u63a0\\u63a1\\u63a2\\u63a3\\u63a4\\u63a5\\u63a6\\u63a7\\u63a8\\u63a9\\u63aa\\u63ab\\u63ac\\u63ad\\u63ae\\u63af\\u63b0\\u63b1\\u63b2\\u63b3\\u63b4\\u63b5\\u63b6\\u63b7\\u63b8\\u63b9\\u63ba\\u63bb\\u63bc\\u63bd\\u63be\\u63bf\\u63c0\\u63c1\\u63c2\\u63c3\\u63c4\\u63c5\\u63c6\\u63c7\\u63c8\\u63c9\\u63ca\\u63cb\\u63cc\\u63cd\\u63ce\\u63cf\\u63d0\\u63d1\\u63d2\\u63d3\\u63d4\\u63d5\\u63d6\\u63d7\\u63d8\\u63d9\\u63da\\u63db\\u63dc\\u63dd\\u63de\\u63df\\u63e0\\u63e1\\u63e2\\u63e3\\u63e4\\u63e5\\u63e6\\u63e7\\u63e8\\u63e9\\u63ea\\u63eb\\u63ec\\u63ed\\u63ee\\u63ef\\u63f0\\u63f1\\u63f2\\u63f3\\u63f4\\u63f5\\u63f6\\u63f7\\u63f8\\u63f9\\u63fa\\u63fb\\u63fc\\u63fd\\u63fe\\u63ff\\u6400\\u6401\\u6402\\u6403\\u6404\\u6405\\u6406\\u6407\\u6408\\u6409\\u640a\\u640b\\u640c\\u640d\\u640e\\u640f\\u6410\\u6411\\u6412\\u6413\\u6414\\u6415\\u6416\\u6417\\u6418\\u6419\\u641a\\u641b\\u641c\\u641d\\u641e\\u641f\\u6420\\u6421\\u6422\\u6423\\u6424\\u6425\\u6426\\u6427\\u6428\\u6429\\u642a\\u642b\\u642c\\u642d\\u642e\\u642f\\u6430\\u6431\\u6432\\u6433\\u6434\\u6435\\u6436\\u6437\\u6438\\u6439\\u643a\\u643b\\u643c\\u643d\\u643e\\u643f\\u6440\\u6441\\u6442\\u6443\\u6444\\u6445\\u6446\\u6447\\u6448\\u6449\\u644a\\u644b\\u644c\\u644d\\u644e\\u644f\\u6450\\u6451\\u6452\\u6453\\u6454\\u6455\\u6456\\u6457\\u6458\\u6459\\u645a\\u645b\\u645c\\u645d\\u645e\\u645f\\u6460\\u6461\\u6462\\u6463\\u6464\\u6465\\u6466\\u6467\\u6468\\u6469\\u646a\\u646b\\u646c\\u646d\\u646e\\u646f\\u6470\\u6471\\u6472\\u6473\\u6474\\u6475\\u6476\\u6477\\u6478\\u6479\\u647a\\u647b\\u647c\\u647d\\u647e\\u647f\\u6480\\u6481\\u6482\\u6483\\u6484\\u6485\\u6486\\u6487\\u6488\\u6489\\u648a\\u648b\\u648c\\u648d\\u648e\\u648f\\u6490\\u6491\\u6492\\u6493\\u6494\\u6495\\u6496\\u6497\\u6498\\u6499\\u649a\\u649b\\u649c\\u649d\\u649e\\u649f\\u64a0\\u64a1\\u64a2\\u64a3\\u64a4\\u64a5\\u64a6\\u64a7\\u64a8\\u64a9\\u64aa\\u64ab\\u64ac\\u64ad\\u64ae\\u64af\\u64b0\\u64b1\\u64b2\\u64b3\\u64b4\\u64b5\\u64b6\\u64b7\\u64b8\\u64b9\\u64ba\\u64bb\\u64bc\\u64bd\\u64be\\u64bf\\u64c0\\u64c1\\u64c2\\u64c3\\u64c4\\u64c5\\u64c6\\u64c7\\u64c8\\u64c9\\u64ca\\u64cb\\u64cc\\u64cd\\u64ce\\u64cf\\u64d0\\u64d1\\u64d2\\u64d3\\u64d4\\u64d5\\u64d6\\u64d7\\u64d8\\u64d9\\u64da\\u64db\\u64dc\\u64dd\\u64de\\u64df\\u64e0\\u64e1\\u64e2\\u64e3\\u64e4\\u64e5\\u64e6\\u64e7\\u64e8\\u64e9\\u64ea\\u64eb\\u64ec\\u64ed\\u64ee\\u64ef\\u64f0\\u64f1\\u64f2\\u64f3\\u64f4\\u64f5\\u64f6\\u64f7\\u64f8\\u64f9\\u64fa\\u64fb\\u64fc\\u64fd\\u64fe\\u64ff\\u6500\\u6501\\u6502\\u6503\\u6504\\u6505\\u6506\\u6507\\u6508\\u6509\\u650a\\u650b\\u650c\\u650d\\u650e\\u650f\\u6510\\u6511\\u6512\\u6513\\u6514\\u6515\\u6516\\u6517\\u6518\\u6519\\u651a\\u651b\\u651c\\u651d\\u651e\\u651f\\u6520\\u6521\\u6522\\u6523\\u6524\\u6525\\u6526\\u6527\\u6528\\u6529\\u652a\\u652b\\u652c\\u652d\\u652e\\u652f\\u6530\\u6531\\u6532\\u6533\\u6534\\u6535\\u6536\\u6537\\u6538\\u6539\\u653a\\u653b\\u653c\\u653d\\u653e\\u653f\\u6540\\u6541\\u6542\\u6543\\u6544\\u6545\\u6546\\u6547\\u6548\\u6549\\u654a\\u654b\\u654c\\u654d\\u654e\\u654f\\u6550\\u6551\\u6552\\u6553\\u6554\\u6555\\u6556\\u6557\\u6558\\u6559\\u655a\\u655b\\u655c\\u655d\\u655e\\u655f\\u6560\\u6561\\u6562\\u6563\\u6564\\u6565\\u6566\\u6567\\u6568\\u6569\\u656a\\u656b\\u656c\\u656d\\u656e\\u656f\\u6570\\u6571\\u6572\\u6573\\u6574\\u6575\\u6576\\u6577\\u6578\\u6579\\u657a\\u657b\\u657c\\u657d\\u657e\\u657f\\u6580\\u6581\\u6582\\u6583\\u6584\\u6585\\u6586\\u6587\\u6588\\u6589\\u658a\\u658b\\u658c\\u658d\\u658e\\u658f\\u6590\\u6591\\u6592\\u6593\\u6594\\u6595\\u6596\\u6597\\u6598\\u6599\\u659a\\u659b\\u659c\\u659d\\u659e\\u659f\\u65a0\\u65a1\\u65a2\\u65a3\\u65a4\\u65a5\\u65a6\\u65a7\\u65a8\\u65a9\\u65aa\\u65ab\\u65ac\\u65ad\\u65ae\\u65af\\u65b0\\u65b1\\u65b2\\u65b3\\u65b4\\u65b5\\u65b6\\u65b7\\u65b8\\u65b9\\u65ba\\u65bb\\u65bc\\u65bd\\u65be\\u65bf\\u65c0\\u65c1\\u65c2\\u65c3\\u65c4\\u65c5\\u65c6\\u65c7\\u65c8\\u65c9\\u65ca\\u65cb\\u65cc\\u65cd\\u65ce\\u65cf\\u65d0\\u65d1\\u65d2\\u65d3\\u65d4\\u65d5\\u65d6\\u65d7\\u65d8\\u65d9\\u65da\\u65db\\u65dc\\u65dd\\u65de\\u65df\\u65e0\\u65e1\\u65e2\\u65e3\\u65e4\\u65e5\\u65e6\\u65e7\\u65e8\\u65e9\\u65ea\\u65eb\\u65ec\\u65ed\\u65ee\\u65ef\\u65f0\\u65f1\\u65f2\\u65f3\\u65f4\\u65f5\\u65f6\\u65f7\\u65f8\\u65f9\\u65fa\\u65fb\\u65fc\\u65fd\\u65fe\\u65ff\\u6600\\u6601\\u6602\\u6603\\u6604\\u6605\\u6606\\u6607\\u6608\\u6609\\u660a\\u660b\\u660c\\u660d\\u660e\\u660f\\u6610\\u6611\\u6612\\u6613\\u6614\\u6615\\u6616\\u6617\\u6618\\u6619\\u661a\\u661b\\u661c\\u661d\\u661e\\u661f\\u6620\\u6621\\u6622\\u6623\\u6624\\u6625\\u6626\\u6627\\u6628\\u6629\\u662a\\u662b\\u662c\\u662d\\u662e\\u662f\\u6630\\u6631\\u6632\\u6633\\u6634\\u6635\\u6636\\u6637\\u6638\\u6639\\u663a\\u663b\\u663c\\u663d\\u663e\\u663f\\u6640\\u6641\\u6642\\u6643\\u6644\\u6645\\u6646\\u6647\\u6648\\u6649\\u664a\\u664b\\u664c\\u664d\\u664e\\u664f\\u6650\\u6651\\u6652\\u6653\\u6654\\u6655\\u6656\\u6657\\u6658\\u6659\\u665a\\u665b\\u665c\\u665d\\u665e\\u665f\\u6660\\u6661\\u6662\\u6663\\u6664\\u6665\\u6666\\u6667\\u6668\\u6669\\u666a\\u666b\\u666c\\u666d\\u666e\\u666f\\u6670\\u6671\\u6672\\u6673\\u6674\\u6675\\u6676\\u6677\\u6678\\u6679\\u667a\\u667b\\u667c\\u667d\\u667e\\u667f\\u6680\\u6681\\u6682\\u6683\\u6684\\u6685\\u6686\\u6687\\u6688\\u6689\\u668a\\u668b\\u668c\\u668d\\u668e\\u668f\\u6690\\u6691\\u6692\\u6693\\u6694\\u6695\\u6696\\u6697\\u6698\\u6699\\u669a\\u669b\\u669c\\u669d\\u669e\\u669f\\u66a0\\u66a1\\u66a2\\u66a3\\u66a4\\u66a5\\u66a6\\u66a7\\u66a8\\u66a9\\u66aa\\u66ab\\u66ac\\u66ad\\u66ae\\u66af\\u66b0\\u66b1\\u66b2\\u66b3\\u66b4\\u66b5\\u66b6\\u66b7\\u66b8\\u66b9\\u66ba\\u66bb\\u66bc\\u66bd\\u66be\\u66bf\\u66c0\\u66c1\\u66c2\\u66c3\\u66c4\\u66c5\\u66c6\\u66c7\\u66c8\\u66c9\\u66ca\\u66cb\\u66cc\\u66cd\\u66ce\\u66cf\\u66d0\\u66d1\\u66d2\\u66d3\\u66d4\\u66d5\\u66d6\\u66d7\\u66d8\\u66d9\\u66da\\u66db\\u66dc\\u66dd\\u66de\\u66df\\u66e0\\u66e1\\u66e2\\u66e3\\u66e4\\u66e5\\u66e6\\u66e7\\u66e8\\u66e9\\u66ea\\u66eb\\u66ec\\u66ed\\u66ee\\u66ef\\u66f0\\u66f1\\u66f2\\u66f3\\u66f4\\u66f5\\u66f6\\u66f7\\u66f8\\u66f9\\u66fa\\u66fb\\u66fc\\u66fd\\u66fe\\u66ff\\u6700\\u6701\\u6702\\u6703\\u6704\\u6705\\u6706\\u6707\\u6708\\u6709\\u670a\\u670b\\u670c\\u670d\\u670e\\u670f\\u6710\\u6711\\u6712\\u6713\\u6714\\u6715\\u6716\\u6717\\u6718\\u6719\\u671a\\u671b\\u671c\\u671d\\u671e\\u671f\\u6720\\u6721\\u6722\\u6723\\u6724\\u6725\\u6726\\u6727\\u6728\\u6729\\u672a\\u672b\\u672c\\u672d\\u672e\\u672f\\u6730\\u6731\\u6732\\u6733\\u6734\\u6735\\u6736\\u6737\\u6738\\u6739\\u673a\\u673b\\u673c\\u673d\\u673e\\u673f\\u6740\\u6741\\u6742\\u6743\\u6744\\u6745\\u6746\\u6747\\u6748\\u6749\\u674a\\u674b\\u674c\\u674d\\u674e\\u674f\\u6750\\u6751\\u6752\\u6753\\u6754\\u6755\\u6756\\u6757\\u6758\\u6759\\u675a\\u675b\\u675c\\u675d\\u675e\\u675f\\u6760\\u6761\\u6762\\u6763\\u6764\\u6765\\u6766\\u6767\\u6768\\u6769\\u676a\\u676b\\u676c\\u676d\\u676e\\u676f\\u6770\\u6771\\u6772\\u6773\\u6774\\u6775\\u6776\\u6777\\u6778\\u6779\\u677a\\u677b\\u677c\\u677d\\u677e\\u677f\\u6780\\u6781\\u6782\\u6783\\u6784\\u6785\\u6786\\u6787\\u6788\\u6789\\u678a\\u678b\\u678c\\u678d\\u678e\\u678f\\u6790\\u6791\\u6792\\u6793\\u6794\\u6795\\u6796\\u6797\\u6798\\u6799\\u679a\\u679b\\u679c\\u679d\\u679e\\u679f\\u67a0\\u67a1\\u67a2\\u67a3\\u67a4\\u67a5\\u67a6\\u67a7\\u67a8\\u67a9\\u67aa\\u67ab\\u67ac\\u67ad\\u67ae\\u67af\\u67b0\\u67b1\\u67b2\\u67b3\\u67b4\\u67b5\\u67b6\\u67b7\\u67b8\\u67b9\\u67ba\\u67bb\\u67bc\\u67bd\\u67be\\u67bf\\u67c0\\u67c1\\u67c2\\u67c3\\u67c4\\u67c5\\u67c6\\u67c7\\u67c8\\u67c9\\u67ca\\u67cb\\u67cc\\u67cd\\u67ce\\u67cf\\u67d0\\u67d1\\u67d2\\u67d3\\u67d4\\u67d5\\u67d6\\u67d7\\u67d8\\u67d9\\u67da\\u67db\\u67dc\\u67dd\\u67de\\u67df\\u67e0\\u67e1\\u67e2\\u67e3\\u67e4\\u67e5\\u67e6\\u67e7\\u67e8\\u67e9\\u67ea\\u67eb\\u67ec\\u67ed\\u67ee\\u67ef\\u67f0\\u67f1\\u67f2\\u67f3\\u67f4\\u67f5\\u67f6\\u67f7\\u67f8\\u67f9\\u67fa\\u67fb\\u67fc\\u67fd\\u67fe\\u67ff\\u6800\\u6801\\u6802\\u6803\\u6804\\u6805\\u6806\\u6807\\u6808\\u6809\\u680a\\u680b\\u680c\\u680d\\u680e\\u680f\\u6810\\u6811\\u6812\\u6813\\u6814\\u6815\\u6816\\u6817\\u6818\\u6819\\u681a\\u681b\\u681c\\u681d\\u681e\\u681f\\u6820\\u6821\\u6822\\u6823\\u6824\\u6825\\u6826\\u6827\\u6828\\u6829\\u682a\\u682b\\u682c\\u682d\\u682e\\u682f\\u6830\\u6831\\u6832\\u6833\\u6834\\u6835\\u6836\\u6837\\u6838\\u6839\\u683a\\u683b\\u683c\\u683d\\u683e\\u683f\\u6840\\u6841\\u6842\\u6843\\u6844\\u6845\\u6846\\u6847\\u6848\\u6849\\u684a\\u684b\\u684c\\u684d\\u684e\\u684f\\u6850\\u6851\\u6852\\u6853\\u6854\\u6855\\u6856\\u6857\\u6858\\u6859\\u685a\\u685b\\u685c\\u685d\\u685e\\u685f\\u6860\\u6861\\u6862\\u6863\\u6864\\u6865\\u6866\\u6867\\u6868\\u6869\\u686a\\u686b\\u686c\\u686d\\u686e\\u686f\\u6870\\u6871\\u6872\\u6873\\u6874\\u6875\\u6876\\u6877\\u6878\\u6879\\u687a\\u687b\\u687c\\u687d\\u687e\\u687f\\u6880\\u6881\\u6882\\u6883\\u6884\\u6885\\u6886\\u6887\\u6888\\u6889\\u688a\\u688b\\u688c\\u688d\\u688e\\u688f\\u6890\\u6891\\u6892\\u6893\\u6894\\u6895\\u6896\\u6897\\u6898\\u6899\\u689a\\u689b\\u689c\\u689d\\u689e\\u689f\\u68a0\\u68a1\\u68a2\\u68a3\\u68a4\\u68a5\\u68a6\\u68a7\\u68a8\\u68a9\\u68aa\\u68ab\\u68ac\\u68ad\\u68ae\\u68af\\u68b0\\u68b1\\u68b2\\u68b3\\u68b4\\u68b5\\u68b6\\u68b7\\u68b8\\u68b9\\u68ba\\u68bb\\u68bc\\u68bd\\u68be\\u68bf\\u68c0\\u68c1\\u68c2\\u68c3\\u68c4\\u68c5\\u68c6\\u68c7\\u68c8\\u68c9\\u68ca\\u68cb\\u68cc\\u68cd\\u68ce\\u68cf\\u68d0\\u68d1\\u68d2\\u68d3\\u68d4\\u68d5\\u68d6\\u68d7\\u68d8\\u68d9\\u68da\\u68db\\u68dc\\u68dd\\u68de\\u68df\\u68e0\\u68e1\\u68e2\\u68e3\\u68e4\\u68e5\\u68e6\\u68e7\\u68e8\\u68e9\\u68ea\\u68eb\\u68ec\\u68ed\\u68ee\\u68ef\\u68f0\\u68f1\\u68f2\\u68f3\\u68f4\\u68f5\\u68f6\\u68f7\\u68f8\\u68f9\\u68fa\\u68fb\\u68fc\\u68fd\\u68fe\\u68ff\\u6900\\u6901\\u6902\\u6903\\u6904\\u6905\\u6906\\u6907\\u6908\\u6909\\u690a\\u690b\\u690c\\u690d\\u690e\\u690f\\u6910\\u6911\\u6912\\u6913\\u6914\\u6915\\u6916\\u6917\\u6918\\u6919\\u691a\\u691b\\u691c\\u691d\\u691e\\u691f\\u6920\\u6921\\u6922\\u6923\\u6924\\u6925\\u6926\\u6927\\u6928\\u6929\\u692a\\u692b\\u692c\\u692d\\u692e\\u692f\\u6930\\u6931\\u6932\\u6933\\u6934\\u6935\\u6936\\u6937\\u6938\\u6939\\u693a\\u693b\\u693c\\u693d\\u693e\\u693f\\u6940\\u6941\\u6942\\u6943\\u6944\\u6945\\u6946\\u6947\\u6948\\u6949\\u694a\\u694b\\u694c\\u694d\\u694e\\u694f\\u6950\\u6951\\u6952\\u6953\\u6954\\u6955\\u6956\\u6957\\u6958\\u6959\\u695a\\u695b\\u695c\\u695d\\u695e\\u695f\\u6960\\u6961\\u6962\\u6963\\u6964\\u6965\\u6966\\u6967\\u6968\\u6969\\u696a\\u696b\\u696c\\u696d\\u696e\\u696f\\u6970\\u6971\\u6972\\u6973\\u6974\\u6975\\u6976\\u6977\\u6978\\u6979\\u697a\\u697b\\u697c\\u697d\\u697e\\u697f\\u6980\\u6981\\u6982\\u6983\\u6984\\u6985\\u6986\\u6987\\u6988\\u6989\\u698a\\u698b\\u698c\\u698d\\u698e\\u698f\\u6990\\u6991\\u6992\\u6993\\u6994\\u6995\\u6996\\u6997\\u6998\\u6999\\u699a\\u699b\\u699c\\u699d\\u699e\\u699f\\u69a0\\u69a1\\u69a2\\u69a3\\u69a4\\u69a5\\u69a6\\u69a7\\u69a8\\u69a9\\u69aa\\u69ab\\u69ac\\u69ad\\u69ae\\u69af\\u69b0\\u69b1\\u69b2\\u69b3\\u69b4\\u69b5\\u69b6\\u69b7\\u69b8\\u69b9\\u69ba\\u69bb\\u69bc\\u69bd\\u69be\\u69bf\\u69c0\\u69c1\\u69c2\\u69c3\\u69c4\\u69c5\\u69c6\\u69c7\\u69c8\\u69c9\\u69ca\\u69cb\\u69cc\\u69cd\\u69ce\\u69cf\\u69d0\\u69d1\\u69d2\\u69d3\\u69d4\\u69d5\\u69d6\\u69d7\\u69d8\\u69d9\\u69da\\u69db\\u69dc\\u69dd\\u69de\\u69df\\u69e0\\u69e1\\u69e2\\u69e3\\u69e4\\u69e5\\u69e6\\u69e7\\u69e8\\u69e9\\u69ea\\u69eb\\u69ec\\u69ed\\u69ee\\u69ef\\u69f0\\u69f1\\u69f2\\u69f3\\u69f4\\u69f5\\u69f6\\u69f7\\u69f8\\u69f9\\u69fa\\u69fb\\u69fc\\u69fd\\u69fe\\u69ff\\u6a00\\u6a01\\u6a02\\u6a03\\u6a04\\u6a05\\u6a06\\u6a07\\u6a08\\u6a09\\u6a0a\\u6a0b\\u6a0c\\u6a0d\\u6a0e\\u6a0f\\u6a10\\u6a11\\u6a12\\u6a13\\u6a14\\u6a15\\u6a16\\u6a17\\u6a18\\u6a19\\u6a1a\\u6a1b\\u6a1c\\u6a1d\\u6a1e\\u6a1f\\u6a20\\u6a21\\u6a22\\u6a23\\u6a24\\u6a25\\u6a26\\u6a27\\u6a28\\u6a29\\u6a2a\\u6a2b\\u6a2c\\u6a2d\\u6a2e\\u6a2f\\u6a30\\u6a31\\u6a32\\u6a33\\u6a34\\u6a35\\u6a36\\u6a37\\u6a38\\u6a39\\u6a3a\\u6a3b\\u6a3c\\u6a3d\\u6a3e\\u6a3f\\u6a40\\u6a41\\u6a42\\u6a43\\u6a44\\u6a45\\u6a46\\u6a47\\u6a48\\u6a49\\u6a4a\\u6a4b\\u6a4c\\u6a4d\\u6a4e\\u6a4f\\u6a50\\u6a51\\u6a52\\u6a53\\u6a54\\u6a55\\u6a56\\u6a57\\u6a58\\u6a59\\u6a5a\\u6a5b\\u6a5c\\u6a5d\\u6a5e\\u6a5f\\u6a60\\u6a61\\u6a62\\u6a63\\u6a64\\u6a65\\u6a66\\u6a67\\u6a68\\u6a69\\u6a6a\\u6a6b\\u6a6c\\u6a6d\\u6a6e\\u6a6f\\u6a70\\u6a71\\u6a72\\u6a73\\u6a74\\u6a75\\u6a76\\u6a77\\u6a78\\u6a79\\u6a7a\\u6a7b\\u6a7c\\u6a7d\\u6a7e\\u6a7f\\u6a80\\u6a81\\u6a82\\u6a83\\u6a84\\u6a85\\u6a86\\u6a87\\u6a88\\u6a89\\u6a8a\\u6a8b\\u6a8c\\u6a8d\\u6a8e\\u6a8f\\u6a90\\u6a91\\u6a92\\u6a93\\u6a94\\u6a95\\u6a96\\u6a97\\u6a98\\u6a99\\u6a9a\\u6a9b\\u6a9c\\u6a9d\\u6a9e\\u6a9f\\u6aa0\\u6aa1\\u6aa2\\u6aa3\\u6aa4\\u6aa5\\u6aa6\\u6aa7\\u6aa8\\u6aa9\\u6aaa\\u6aab\\u6aac\\u6aad\\u6aae\\u6aaf\\u6ab0\\u6ab1\\u6ab2\\u6ab3\\u6ab4\\u6ab5\\u6ab6\\u6ab7\\u6ab8\\u6ab9\\u6aba\\u6abb\\u6abc\\u6abd\\u6abe\\u6abf\\u6ac0\\u6ac1\\u6ac2\\u6ac3\\u6ac4\\u6ac5\\u6ac6\\u6ac7\\u6ac8\\u6ac9\\u6aca\\u6acb\\u6acc\\u6acd\\u6ace\\u6acf\\u6ad0\\u6ad1\\u6ad2\\u6ad3\\u6ad4\\u6ad5\\u6ad6\\u6ad7\\u6ad8\\u6ad9\\u6ada\\u6adb\\u6adc\\u6add\\u6ade\\u6adf\\u6ae0\\u6ae1\\u6ae2\\u6ae3\\u6ae4\\u6ae5\\u6ae6\\u6ae7\\u6ae8\\u6ae9\\u6aea\\u6aeb\\u6aec\\u6aed\\u6aee\\u6aef\\u6af0\\u6af1\\u6af2\\u6af3\\u6af4\\u6af5\\u6af6\\u6af7\\u6af8\\u6af9\\u6afa\\u6afb\\u6afc\\u6afd\\u6afe\\u6aff\\u6b00\\u6b01\\u6b02\\u6b03\\u6b04\\u6b05\\u6b06\\u6b07\\u6b08\\u6b09\\u6b0a\\u6b0b\\u6b0c\\u6b0d\\u6b0e\\u6b0f\\u6b10\\u6b11\\u6b12\\u6b13\\u6b14\\u6b15\\u6b16\\u6b17\\u6b18\\u6b19\\u6b1a\\u6b1b\\u6b1c\\u6b1d\\u6b1e\\u6b1f\\u6b20\\u6b21\\u6b22\\u6b23\\u6b24\\u6b25\\u6b26\\u6b27\\u6b28\\u6b29\\u6b2a\\u6b2b\\u6b2c\\u6b2d\\u6b2e\\u6b2f\\u6b30\\u6b31\\u6b32\\u6b33\\u6b34\\u6b35\\u6b36\\u6b37\\u6b38\\u6b39\\u6b3a\\u6b3b\\u6b3c\\u6b3d\\u6b3e\\u6b3f\\u6b40\\u6b41\\u6b42\\u6b43\\u6b44\\u6b45\\u6b46\\u6b47\\u6b48\\u6b49\\u6b4a\\u6b4b\\u6b4c\\u6b4d\\u6b4e\\u6b4f\\u6b50\\u6b51\\u6b52\\u6b53\\u6b54\\u6b55\\u6b56\\u6b57\\u6b58\\u6b59\\u6b5a\\u6b5b\\u6b5c\\u6b5d\\u6b5e\\u6b5f\\u6b60\\u6b61\\u6b62\\u6b63\\u6b64\\u6b65\\u6b66\\u6b67\\u6b68\\u6b69\\u6b6a\\u6b6b\\u6b6c\\u6b6d\\u6b6e\\u6b6f\\u6b70\\u6b71\\u6b72\\u6b73\\u6b74\\u6b75\\u6b76\\u6b77\\u6b78\\u6b79\\u6b7a\\u6b7b\\u6b7c\\u6b7d\\u6b7e\\u6b7f\\u6b80\\u6b81\\u6b82\\u6b83\\u6b84\\u6b85\\u6b86\\u6b87\\u6b88\\u6b89\\u6b8a\\u6b8b\\u6b8c\\u6b8d\\u6b8e\\u6b8f\\u6b90\\u6b91\\u6b92\\u6b93\\u6b94\\u6b95\\u6b96\\u6b97\\u6b98\\u6b99\\u6b9a\\u6b9b\\u6b9c\\u6b9d\\u6b9e\\u6b9f\\u6ba0\\u6ba1\\u6ba2\\u6ba3\\u6ba4\\u6ba5\\u6ba6\\u6ba7\\u6ba8\\u6ba9\\u6baa\\u6bab\\u6bac\\u6bad\\u6bae\\u6baf\\u6bb0\\u6bb1\\u6bb2\\u6bb3\\u6bb4\\u6bb5\\u6bb6\\u6bb7\\u6bb8\\u6bb9\\u6bba\\u6bbb\\u6bbc\\u6bbd\\u6bbe\\u6bbf\\u6bc0\\u6bc1\\u6bc2\\u6bc3\\u6bc4\\u6bc5\\u6bc6\\u6bc7\\u6bc8\\u6bc9\\u6bca\\u6bcb\\u6bcc\\u6bcd\\u6bce\\u6bcf\\u6bd0\\u6bd1\\u6bd2\\u6bd3\\u6bd4\\u6bd5\\u6bd6\\u6bd7\\u6bd8\\u6bd9\\u6bda\\u6bdb\\u6bdc\\u6bdd\\u6bde\\u6bdf\\u6be0\\u6be1\\u6be2\\u6be3\\u6be4\\u6be5\\u6be6\\u6be7\\u6be8\\u6be9\\u6bea\\u6beb\\u6bec\\u6bed\\u6bee\\u6bef\\u6bf0\\u6bf1\\u6bf2\\u6bf3\\u6bf4\\u6bf5\\u6bf6\\u6bf7\\u6bf8\\u6bf9\\u6bfa\\u6bfb\\u6bfc\\u6bfd\\u6bfe\\u6bff\\u6c00\\u6c01\\u6c02\\u6c03\\u6c04\\u6c05\\u6c06\\u6c07\\u6c08\\u6c09\\u6c0a\\u6c0b\\u6c0c\\u6c0d\\u6c0e\\u6c0f\\u6c10\\u6c11\\u6c12\\u6c13\\u6c14\\u6c15\\u6c16\\u6c17\\u6c18\\u6c19\\u6c1a\\u6c1b\\u6c1c\\u6c1d\\u6c1e\\u6c1f\\u6c20\\u6c21\\u6c22\\u6c23\\u6c24\\u6c25\\u6c26\\u6c27\\u6c28\\u6c29\\u6c2a\\u6c2b\\u6c2c\\u6c2d\\u6c2e\\u6c2f\\u6c30\\u6c31\\u6c32\\u6c33\\u6c34\\u6c35\\u6c36\\u6c37\\u6c38\\u6c39\\u6c3a\\u6c3b\\u6c3c\\u6c3d\\u6c3e\\u6c3f\\u6c40\\u6c41\\u6c42\\u6c43\\u6c44\\u6c45\\u6c46\\u6c47\\u6c48\\u6c49\\u6c4a\\u6c4b\\u6c4c\\u6c4d\\u6c4e\\u6c4f\\u6c50\\u6c51\\u6c52\\u6c53\\u6c54\\u6c55\\u6c56\\u6c57\\u6c58\\u6c59\\u6c5a\\u6c5b\\u6c5c\\u6c5d\\u6c5e\\u6c5f\\u6c60\\u6c61\\u6c62\\u6c63\\u6c64\\u6c65\\u6c66\\u6c67\\u6c68\\u6c69\\u6c6a\\u6c6b\\u6c6c\\u6c6d\\u6c6e\\u6c6f\\u6c70\\u6c71\\u6c72\\u6c73\\u6c74\\u6c75\\u6c76\\u6c77\\u6c78\\u6c79\\u6c7a\\u6c7b\\u6c7c\\u6c7d\\u6c7e\\u6c7f\\u6c80\\u6c81\\u6c82\\u6c83\\u6c84\\u6c85\\u6c86\\u6c87\\u6c88\\u6c89\\u6c8a\\u6c8b\\u6c8c\\u6c8d\\u6c8e\\u6c8f\\u6c90\\u6c91\\u6c92\\u6c93\\u6c94\\u6c95\\u6c96\\u6c97\\u6c98\\u6c99\\u6c9a\\u6c9b\\u6c9c\\u6c9d\\u6c9e\\u6c9f\\u6ca0\\u6ca1\\u6ca2\\u6ca3\\u6ca4\\u6ca5\\u6ca6\\u6ca7\\u6ca8\\u6ca9\\u6caa\\u6cab\\u6cac\\u6cad\\u6cae\\u6caf\\u6cb0\\u6cb1\\u6cb2\\u6cb3\\u6cb4\\u6cb5\\u6cb6\\u6cb7\\u6cb8\\u6cb9\\u6cba\\u6cbb\\u6cbc\\u6cbd\\u6cbe\\u6cbf\\u6cc0\\u6cc1\\u6cc2\\u6cc3\\u6cc4\\u6cc5\\u6cc6\\u6cc7\\u6cc8\\u6cc9\\u6cca\\u6ccb\\u6ccc\\u6ccd\\u6cce\\u6ccf\\u6cd0\\u6cd1\\u6cd2\\u6cd3\\u6cd4\\u6cd5\\u6cd6\\u6cd7\\u6cd8\\u6cd9\\u6cda\\u6cdb\\u6cdc\\u6cdd\\u6cde\\u6cdf\\u6ce0\\u6ce1\\u6ce2\\u6ce3\\u6ce4\\u6ce5\\u6ce6\\u6ce7\\u6ce8\\u6ce9\\u6cea\\u6ceb\\u6cec\\u6ced\\u6cee\\u6cef\\u6cf0\\u6cf1\\u6cf2\\u6cf3\\u6cf4\\u6cf5\\u6cf6\\u6cf7\\u6cf8\\u6cf9\\u6cfa\\u6cfb\\u6cfc\\u6cfd\\u6cfe\\u6cff\\u6d00\\u6d01\\u6d02\\u6d03\\u6d04\\u6d05\\u6d06\\u6d07\\u6d08\\u6d09\\u6d0a\\u6d0b\\u6d0c\\u6d0d\\u6d0e\\u6d0f\\u6d10\\u6d11\\u6d12\\u6d13\\u6d14\\u6d15\\u6d16\\u6d17\\u6d18\\u6d19\\u6d1a\\u6d1b\\u6d1c\\u6d1d\\u6d1e\\u6d1f\\u6d20\\u6d21\\u6d22\\u6d23\\u6d24\\u6d25\\u6d26\\u6d27\\u6d28\\u6d29\\u6d2a\\u6d2b\\u6d2c\\u6d2d\\u6d2e\\u6d2f\\u6d30\\u6d31\\u6d32\\u6d33\\u6d34\\u6d35\\u6d36\\u6d37\\u6d38\\u6d39\\u6d3a\\u6d3b\\u6d3c\\u6d3d\\u6d3e\\u6d3f\\u6d40\\u6d41\\u6d42\\u6d43\\u6d44\\u6d45\\u6d46\\u6d47\\u6d48\\u6d49\\u6d4a\\u6d4b\\u6d4c\\u6d4d\\u6d4e\\u6d4f\\u6d50\\u6d51\\u6d52\\u6d53\\u6d54\\u6d55\\u6d56\\u6d57\\u6d58\\u6d59\\u6d5a\\u6d5b\\u6d5c\\u6d5d\\u6d5e\\u6d5f\\u6d60\\u6d61\\u6d62\\u6d63\\u6d64\\u6d65\\u6d66\\u6d67\\u6d68\\u6d69\\u6d6a\\u6d6b\\u6d6c\\u6d6d\\u6d6e\\u6d6f\\u6d70\\u6d71\\u6d72\\u6d73\\u6d74\\u6d75\\u6d76\\u6d77\\u6d78\\u6d79\\u6d7a\\u6d7b\\u6d7c\\u6d7d\\u6d7e\\u6d7f\\u6d80\\u6d81\\u6d82\\u6d83\\u6d84\\u6d85\\u6d86\\u6d87\\u6d88\\u6d89\\u6d8a\\u6d8b\\u6d8c\\u6d8d\\u6d8e\\u6d8f\\u6d90\\u6d91\\u6d92\\u6d93\\u6d94\\u6d95\\u6d96\\u6d97\\u6d98\\u6d99\\u6d9a\\u6d9b\\u6d9c\\u6d9d\\u6d9e\\u6d9f\\u6da0\\u6da1\\u6da2\\u6da3\\u6da4\\u6da5\\u6da6\\u6da7\\u6da8\\u6da9\\u6daa\\u6dab\\u6dac\\u6dad\\u6dae\\u6daf\\u6db0\\u6db1\\u6db2\\u6db3\\u6db4\\u6db5\\u6db6\\u6db7\\u6db8\\u6db9\\u6dba\\u6dbb\\u6dbc\\u6dbd\\u6dbe\\u6dbf\\u6dc0\\u6dc1\\u6dc2\\u6dc3\\u6dc4\\u6dc5\\u6dc6\\u6dc7\\u6dc8\\u6dc9\\u6dca\\u6dcb\\u6dcc\\u6dcd\\u6dce\\u6dcf\\u6dd0\\u6dd1\\u6dd2\\u6dd3\\u6dd4\\u6dd5\\u6dd6\\u6dd7\\u6dd8\\u6dd9\\u6dda\\u6ddb\\u6ddc\\u6ddd\\u6dde\\u6ddf\\u6de0\\u6de1\\u6de2\\u6de3\\u6de4\\u6de5\\u6de6\\u6de7\\u6de8\\u6de9\\u6dea\\u6deb\\u6dec\\u6ded\\u6dee\\u6def\\u6df0\\u6df1\\u6df2\\u6df3\\u6df4\\u6df5\\u6df6\\u6df7\\u6df8\\u6df9\\u6dfa\\u6dfb\\u6dfc\\u6dfd\\u6dfe\\u6dff\\u6e00\\u6e01\\u6e02\\u6e03\\u6e04\\u6e05\\u6e06\\u6e07\\u6e08\\u6e09\\u6e0a\\u6e0b\\u6e0c\\u6e0d\\u6e0e\\u6e0f\\u6e10\\u6e11\\u6e12\\u6e13\\u6e14\\u6e15\\u6e16\\u6e17\\u6e18\\u6e19\\u6e1a\\u6e1b\\u6e1c\\u6e1d\\u6e1e\\u6e1f\\u6e20\\u6e21\\u6e22\\u6e23\\u6e24\\u6e25\\u6e26\\u6e27\\u6e28\\u6e29\\u6e2a\\u6e2b\\u6e2c\\u6e2d\\u6e2e\\u6e2f\\u6e30\\u6e31\\u6e32\\u6e33\\u6e34\\u6e35\\u6e36\\u6e37\\u6e38\\u6e39\\u6e3a\\u6e3b\\u6e3c\\u6e3d\\u6e3e\\u6e3f\\u6e40\\u6e41\\u6e42\\u6e43\\u6e44\\u6e45\\u6e46\\u6e47\\u6e48\\u6e49\\u6e4a\\u6e4b\\u6e4c\\u6e4d\\u6e4e\\u6e4f\\u6e50\\u6e51\\u6e52\\u6e53\\u6e54\\u6e55\\u6e56\\u6e57\\u6e58\\u6e59\\u6e5a\\u6e5b\\u6e5c\\u6e5d\\u6e5e\\u6e5f\\u6e60\\u6e61\\u6e62\\u6e63\\u6e64\\u6e65\\u6e66\\u6e67\\u6e68\\u6e69\\u6e6a\\u6e6b\\u6e6c\\u6e6d\\u6e6e\\u6e6f\\u6e70\\u6e71\\u6e72\\u6e73\\u6e74\\u6e75\\u6e76\\u6e77\\u6e78\\u6e79\\u6e7a\\u6e7b\\u6e7c\\u6e7d\\u6e7e\\u6e7f\\u6e80\\u6e81\\u6e82\\u6e83\\u6e84\\u6e85\\u6e86\\u6e87\\u6e88\\u6e89\\u6e8a\\u6e8b\\u6e8c\\u6e8d\\u6e8e\\u6e8f\\u6e90\\u6e91\\u6e92\\u6e93\\u6e94\\u6e95\\u6e96\\u6e97\\u6e98\\u6e99\\u6e9a\\u6e9b\\u6e9c\\u6e9d\\u6e9e\\u6e9f\\u6ea0\\u6ea1\\u6ea2\\u6ea3\\u6ea4\\u6ea5\\u6ea6\\u6ea7\\u6ea8\\u6ea9\\u6eaa\\u6eab\\u6eac\\u6ead\\u6eae\\u6eaf\\u6eb0\\u6eb1\\u6eb2\\u6eb3\\u6eb4\\u6eb5\\u6eb6\\u6eb7\\u6eb8\\u6eb9\\u6eba\\u6ebb\\u6ebc\\u6ebd\\u6ebe\\u6ebf\\u6ec0\\u6ec1\\u6ec2\\u6ec3\\u6ec4\\u6ec5\\u6ec6\\u6ec7\\u6ec8\\u6ec9\\u6eca\\u6ecb\\u6ecc\\u6ecd\\u6ece\\u6ecf\\u6ed0\\u6ed1\\u6ed2\\u6ed3\\u6ed4\\u6ed5\\u6ed6\\u6ed7\\u6ed8\\u6ed9\\u6eda\\u6edb\\u6edc\\u6edd\\u6ede\\u6edf\\u6ee0\\u6ee1\\u6ee2\\u6ee3\\u6ee4\\u6ee5\\u6ee6\\u6ee7\\u6ee8\\u6ee9\\u6eea\\u6eeb\\u6eec\\u6eed\\u6eee\\u6eef\\u6ef0\\u6ef1\\u6ef2\\u6ef3\\u6ef4\\u6ef5\\u6ef6\\u6ef7\\u6ef8\\u6ef9\\u6efa\\u6efb\\u6efc\\u6efd\\u6efe\\u6eff\\u6f00\\u6f01\\u6f02\\u6f03\\u6f04\\u6f05\\u6f06\\u6f07\\u6f08\\u6f09\\u6f0a\\u6f0b\\u6f0c\\u6f0d\\u6f0e\\u6f0f\\u6f10\\u6f11\\u6f12\\u6f13\\u6f14\\u6f15\\u6f16\\u6f17\\u6f18\\u6f19\\u6f1a\\u6f1b\\u6f1c\\u6f1d\\u6f1e\\u6f1f\\u6f20\\u6f21\\u6f22\\u6f23\\u6f24\\u6f25\\u6f26\\u6f27\\u6f28\\u6f29\\u6f2a\\u6f2b\\u6f2c\\u6f2d\\u6f2e\\u6f2f\\u6f30\\u6f31\\u6f32\\u6f33\\u6f34\\u6f35\\u6f36\\u6f37\\u6f38\\u6f39\\u6f3a\\u6f3b\\u6f3c\\u6f3d\\u6f3e\\u6f3f\\u6f40\\u6f41\\u6f42\\u6f43\\u6f44\\u6f45\\u6f46\\u6f47\\u6f48\\u6f49\\u6f4a\\u6f4b\\u6f4c\\u6f4d\\u6f4e\\u6f4f\\u6f50\\u6f51\\u6f52\\u6f53\\u6f54\\u6f55\\u6f56\\u6f57\\u6f58\\u6f59\\u6f5a\\u6f5b\\u6f5c\\u6f5d\\u6f5e\\u6f5f\\u6f60\\u6f61\\u6f62\\u6f63\\u6f64\\u6f65\\u6f66\\u6f67\\u6f68\\u6f69\\u6f6a\\u6f6b\\u6f6c\\u6f6d\\u6f6e\\u6f6f\\u6f70\\u6f71\\u6f72\\u6f73\\u6f74\\u6f75\\u6f76\\u6f77\\u6f78\\u6f79\\u6f7a\\u6f7b\\u6f7c\\u6f7d\\u6f7e\\u6f7f\\u6f80\\u6f81\\u6f82\\u6f83\\u6f84\\u6f85\\u6f86\\u6f87\\u6f88\\u6f89\\u6f8a\\u6f8b\\u6f8c\\u6f8d\\u6f8e\\u6f8f\\u6f90\\u6f91\\u6f92\\u6f93\\u6f94\\u6f95\\u6f96\\u6f97\\u6f98\\u6f99\\u6f9a\\u6f9b\\u6f9c\\u6f9d\\u6f9e\\u6f9f\\u6fa0\\u6fa1\\u6fa2\\u6fa3\\u6fa4\\u6fa5\\u6fa6\\u6fa7\\u6fa8\\u6fa9\\u6faa\\u6fab\\u6fac\\u6fad\\u6fae\\u6faf\\u6fb0\\u6fb1\\u6fb2\\u6fb3\\u6fb4\\u6fb5\\u6fb6\\u6fb7\\u6fb8\\u6fb9\\u6fba\\u6fbb\\u6fbc\\u6fbd\\u6fbe\\u6fbf\\u6fc0\\u6fc1\\u6fc2\\u6fc3\\u6fc4\\u6fc5\\u6fc6\\u6fc7\\u6fc8\\u6fc9\\u6fca\\u6fcb\\u6fcc\\u6fcd\\u6fce\\u6fcf\\u6fd0\\u6fd1\\u6fd2\\u6fd3\\u6fd4\\u6fd5\\u6fd6\\u6fd7\\u6fd8\\u6fd9\\u6fda\\u6fdb\\u6fdc\\u6fdd\\u6fde\\u6fdf\\u6fe0\\u6fe1\\u6fe2\\u6fe3\\u6fe4\\u6fe5\\u6fe6\\u6fe7\\u6fe8\\u6fe9\\u6fea\\u6feb\\u6fec\\u6fed\\u6fee\\u6fef\\u6ff0\\u6ff1\\u6ff2\\u6ff3\\u6ff4\\u6ff5\\u6ff6\\u6ff7\\u6ff8\\u6ff9\\u6ffa\\u6ffb\\u6ffc\\u6ffd\\u6ffe\\u6fff\\u7000\\u7001\\u7002\\u7003\\u7004\\u7005\\u7006\\u7007\\u7008\\u7009\\u700a\\u700b\\u700c\\u700d\\u700e\\u700f\\u7010\\u7011\\u7012\\u7013\\u7014\\u7015\\u7016\\u7017\\u7018\\u7019\\u701a\\u701b\\u701c\\u701d\\u701e\\u701f\\u7020\\u7021\\u7022\\u7023\\u7024\\u7025\\u7026\\u7027\\u7028\\u7029\\u702a\\u702b\\u702c\\u702d\\u702e\\u702f\\u7030\\u7031\\u7032\\u7033\\u7034\\u7035\\u7036\\u7037\\u7038\\u7039\\u703a\\u703b\\u703c\\u703d\\u703e\\u703f\\u7040\\u7041\\u7042\\u7043\\u7044\\u7045\\u7046\\u7047\\u7048\\u7049\\u704a\\u704b\\u704c\\u704d\\u704e\\u704f\\u7050\\u7051\\u7052\\u7053\\u7054\\u7055\\u7056\\u7057\\u7058\\u7059\\u705a\\u705b\\u705c\\u705d\\u705e\\u705f\\u7060\\u7061\\u7062\\u7063\\u7064\\u7065\\u7066\\u7067\\u7068\\u7069\\u706a\\u706b\\u706c\\u706d\\u706e\\u706f\\u7070\\u7071\\u7072\\u7073\\u7074\\u7075\\u7076\\u7077\\u7078\\u7079\\u707a\\u707b\\u707c\\u707d\\u707e\\u707f\\u7080\\u7081\\u7082\\u7083\\u7084\\u7085\\u7086\\u7087\\u7088\\u7089\\u708a\\u708b\\u708c\\u708d\\u708e\\u708f\\u7090\\u7091\\u7092\\u7093\\u7094\\u7095\\u7096\\u7097\\u7098\\u7099\\u709a\\u709b\\u709c\\u709d\\u709e\\u709f\\u70a0\\u70a1\\u70a2\\u70a3\\u70a4\\u70a5\\u70a6\\u70a7\\u70a8\\u70a9\\u70aa\\u70ab\\u70ac\\u70ad\\u70ae\\u70af\\u70b0\\u70b1\\u70b2\\u70b3\\u70b4\\u70b5\\u70b6\\u70b7\\u70b8\\u70b9\\u70ba\\u70bb\\u70bc\\u70bd\\u70be\\u70bf\\u70c0\\u70c1\\u70c2\\u70c3\\u70c4\\u70c5\\u70c6\\u70c7\\u70c8\\u70c9\\u70ca\\u70cb\\u70cc\\u70cd\\u70ce\\u70cf\\u70d0\\u70d1\\u70d2\\u70d3\\u70d4\\u70d5\\u70d6\\u70d7\\u70d8\\u70d9\\u70da\\u70db\\u70dc\\u70dd\\u70de\\u70df\\u70e0\\u70e1\\u70e2\\u70e3\\u70e4\\u70e5\\u70e6\\u70e7\\u70e8\\u70e9\\u70ea\\u70eb\\u70ec\\u70ed\\u70ee\\u70ef\\u70f0\\u70f1\\u70f2\\u70f3\\u70f4\\u70f5\\u70f6\\u70f7\\u70f8\\u70f9\\u70fa\\u70fb\\u70fc\\u70fd\\u70fe\\u70ff\\u7100\\u7101\\u7102\\u7103\\u7104\\u7105\\u7106\\u7107\\u7108\\u7109\\u710a\\u710b\\u710c\\u710d\\u710e\\u710f\\u7110\\u7111\\u7112\\u7113\\u7114\\u7115\\u7116\\u7117\\u7118\\u7119\\u711a\\u711b\\u711c\\u711d\\u711e\\u711f\\u7120\\u7121\\u7122\\u7123\\u7124\\u7125\\u7126\\u7127\\u7128\\u7129\\u712a\\u712b\\u712c\\u712d\\u712e\\u712f\\u7130\\u7131\\u7132\\u7133\\u7134\\u7135\\u7136\\u7137\\u7138\\u7139\\u713a\\u713b\\u713c\\u713d\\u713e\\u713f\\u7140\\u7141\\u7142\\u7143\\u7144\\u7145\\u7146\\u7147\\u7148\\u7149\\u714a\\u714b\\u714c\\u714d\\u714e\\u714f\\u7150\\u7151\\u7152\\u7153\\u7154\\u7155\\u7156\\u7157\\u7158\\u7159\\u715a\\u715b\\u715c\\u715d\\u715e\\u715f\\u7160\\u7161\\u7162\\u7163\\u7164\\u7165\\u7166\\u7167\\u7168\\u7169\\u716a\\u716b\\u716c\\u716d\\u716e\\u716f\\u7170\\u7171\\u7172\\u7173\\u7174\\u7175\\u7176\\u7177\\u7178\\u7179\\u717a\\u717b\\u717c\\u717d\\u717e\\u717f\\u7180\\u7181\\u7182\\u7183\\u7184\\u7185\\u7186\\u7187\\u7188\\u7189\\u718a\\u718b\\u718c\\u718d\\u718e\\u718f\\u7190\\u7191\\u7192\\u7193\\u7194\\u7195\\u7196\\u7197\\u7198\\u7199\\u719a\\u719b\\u719c\\u719d\\u719e\\u719f\\u71a0\\u71a1\\u71a2\\u71a3\\u71a4\\u71a5\\u71a6\\u71a7\\u71a8\\u71a9\\u71aa\\u71ab\\u71ac\\u71ad\\u71ae\\u71af\\u71b0\\u71b1\\u71b2\\u71b3\\u71b4\\u71b5\\u71b6\\u71b7\\u71b8\\u71b9\\u71ba\\u71bb\\u71bc\\u71bd\\u71be\\u71bf\\u71c0\\u71c1\\u71c2\\u71c3\\u71c4\\u71c5\\u71c6\\u71c7\\u71c8\\u71c9\\u71ca\\u71cb\\u71cc\\u71cd\\u71ce\\u71cf\\u71d0\\u71d1\\u71d2\\u71d3\\u71d4\\u71d5\\u71d6\\u71d7\\u71d8\\u71d9\\u71da\\u71db\\u71dc\\u71dd\\u71de\\u71df\\u71e0\\u71e1\\u71e2\\u71e3\\u71e4\\u71e5\\u71e6\\u71e7\\u71e8\\u71e9\\u71ea\\u71eb\\u71ec\\u71ed\\u71ee\\u71ef\\u71f0\\u71f1\\u71f2\\u71f3\\u71f4\\u71f5\\u71f6\\u71f7\\u71f8\\u71f9\\u71fa\\u71fb\\u71fc\\u71fd\\u71fe\\u71ff\\u7200\\u7201\\u7202\\u7203\\u7204\\u7205\\u7206\\u7207\\u7208\\u7209\\u720a\\u720b\\u720c\\u720d\\u720e\\u720f\\u7210\\u7211\\u7212\\u7213\\u7214\\u7215\\u7216\\u7217\\u7218\\u7219\\u721a\\u721b\\u721c\\u721d\\u721e\\u721f\\u7220\\u7221\\u7222\\u7223\\u7224\\u7225\\u7226\\u7227\\u7228\\u7229\\u722a\\u722b\\u722c\\u722d\\u722e\\u722f\\u7230\\u7231\\u7232\\u7233\\u7234\\u7235\\u7236\\u7237\\u7238\\u7239\\u723a\\u723b\\u723c\\u723d\\u723e\\u723f\\u7240\\u7241\\u7242\\u7243\\u7244\\u7245\\u7246\\u7247\\u7248\\u7249\\u724a\\u724b\\u724c\\u724d\\u724e\\u724f\\u7250\\u7251\\u7252\\u7253\\u7254\\u7255\\u7256\\u7257\\u7258\\u7259\\u725a\\u725b\\u725c\\u725d\\u725e\\u725f\\u7260\\u7261\\u7262\\u7263\\u7264\\u7265\\u7266\\u7267\\u7268\\u7269\\u726a\\u726b\\u726c\\u726d\\u726e\\u726f\\u7270\\u7271\\u7272\\u7273\\u7274\\u7275\\u7276\\u7277\\u7278\\u7279\\u727a\\u727b\\u727c\\u727d\\u727e\\u727f\\u7280\\u7281\\u7282\\u7283\\u7284\\u7285\\u7286\\u7287\\u7288\\u7289\\u728a\\u728b\\u728c\\u728d\\u728e\\u728f\\u7290\\u7291\\u7292\\u7293\\u7294\\u7295\\u7296\\u7297\\u7298\\u7299\\u729a\\u729b\\u729c\\u729d\\u729e\\u729f\\u72a0\\u72a1\\u72a2\\u72a3\\u72a4\\u72a5\\u72a6\\u72a7\\u72a8\\u72a9\\u72aa\\u72ab\\u72ac\\u72ad\\u72ae\\u72af\\u72b0\\u72b1\\u72b2\\u72b3\\u72b4\\u72b5\\u72b6\\u72b7\\u72b8\\u72b9\\u72ba\\u72bb\\u72bc\\u72bd\\u72be\\u72bf\\u72c0\\u72c1\\u72c2\\u72c3\\u72c4\\u72c5\\u72c6\\u72c7\\u72c8\\u72c9\\u72ca\\u72cb\\u72cc\\u72cd\\u72ce\\u72cf\\u72d0\\u72d1\\u72d2\\u72d3\\u72d4\\u72d5\\u72d6\\u72d7\\u72d8\\u72d9\\u72da\\u72db\\u72dc\\u72dd\\u72de\\u72df\\u72e0\\u72e1\\u72e2\\u72e3\\u72e4\\u72e5\\u72e6\\u72e7\\u72e8\\u72e9\\u72ea\\u72eb\\u72ec\\u72ed\\u72ee\\u72ef\\u72f0\\u72f1\\u72f2\\u72f3\\u72f4\\u72f5\\u72f6\\u72f7\\u72f8\\u72f9\\u72fa\\u72fb\\u72fc\\u72fd\\u72fe\\u72ff\\u7300\\u7301\\u7302\\u7303\\u7304\\u7305\\u7306\\u7307\\u7308\\u7309\\u730a\\u730b\\u730c\\u730d\\u730e\\u730f\\u7310\\u7311\\u7312\\u7313\\u7314\\u7315\\u7316\\u7317\\u7318\\u7319\\u731a\\u731b\\u731c\\u731d\\u731e\\u731f\\u7320\\u7321\\u7322\\u7323\\u7324\\u7325\\u7326\\u7327\\u7328\\u7329\\u732a\\u732b\\u732c\\u732d\\u732e\\u732f\\u7330\\u7331\\u7332\\u7333\\u7334\\u7335\\u7336\\u7337\\u7338\\u7339\\u733a\\u733b\\u733c\\u733d\\u733e\\u733f\\u7340\\u7341\\u7342\\u7343\\u7344\\u7345\\u7346\\u7347\\u7348\\u7349\\u734a\\u734b\\u734c\\u734d\\u734e\\u734f\\u7350\\u7351\\u7352\\u7353\\u7354\\u7355\\u7356\\u7357\\u7358\\u7359\\u735a\\u735b\\u735c\\u735d\\u735e\\u735f\\u7360\\u7361\\u7362\\u7363\\u7364\\u7365\\u7366\\u7367\\u7368\\u7369\\u736a\\u736b\\u736c\\u736d\\u736e\\u736f\\u7370\\u7371\\u7372\\u7373\\u7374\\u7375\\u7376\\u7377\\u7378\\u7379\\u737a\\u737b\\u737c\\u737d\\u737e\\u737f\\u7380\\u7381\\u7382\\u7383\\u7384\\u7385\\u7386\\u7387\\u7388\\u7389\\u738a\\u738b\\u738c\\u738d\\u738e\\u738f\\u7390\\u7391\\u7392\\u7393\\u7394\\u7395\\u7396\\u7397\\u7398\\u7399\\u739a\\u739b\\u739c\\u739d\\u739e\\u739f\\u73a0\\u73a1\\u73a2\\u73a3\\u73a4\\u73a5\\u73a6\\u73a7\\u73a8\\u73a9\\u73aa\\u73ab\\u73ac\\u73ad\\u73ae\\u73af\\u73b0\\u73b1\\u73b2\\u73b3\\u73b4\\u73b5\\u73b6\\u73b7\\u73b8\\u73b9\\u73ba\\u73bb\\u73bc\\u73bd\\u73be\\u73bf\\u73c0\\u73c1\\u73c2\\u73c3\\u73c4\\u73c5\\u73c6\\u73c7\\u73c8\\u73c9\\u73ca\\u73cb\\u73cc\\u73cd\\u73ce\\u73cf\\u73d0\\u73d1\\u73d2\\u73d3\\u73d4\\u73d5\\u73d6\\u73d7\\u73d8\\u73d9\\u73da\\u73db\\u73dc\\u73dd\\u73de\\u73df\\u73e0\\u73e1\\u73e2\\u73e3\\u73e4\\u73e5\\u73e6\\u73e7\\u73e8\\u73e9\\u73ea\\u73eb\\u73ec\\u73ed\\u73ee\\u73ef\\u73f0\\u73f1\\u73f2\\u73f3\\u73f4\\u73f5\\u73f6\\u73f7\\u73f8\\u73f9\\u73fa\\u73fb\\u73fc\\u73fd\\u73fe\\u73ff\\u7400\\u7401\\u7402\\u7403\\u7404\\u7405\\u7406\\u7407\\u7408\\u7409\\u740a\\u740b\\u740c\\u740d\\u740e\\u740f\\u7410\\u7411\\u7412\\u7413\\u7414\\u7415\\u7416\\u7417\\u7418\\u7419\\u741a\\u741b\\u741c\\u741d\\u741e\\u741f\\u7420\\u7421\\u7422\\u7423\\u7424\\u7425\\u7426\\u7427\\u7428\\u7429\\u742a\\u742b\\u742c\\u742d\\u742e\\u742f\\u7430\\u7431\\u7432\\u7433\\u7434\\u7435\\u7436\\u7437\\u7438\\u7439\\u743a\\u743b\\u743c\\u743d\\u743e\\u743f\\u7440\\u7441\\u7442\\u7443\\u7444\\u7445\\u7446\\u7447\\u7448\\u7449\\u744a\\u744b\\u744c\\u744d\\u744e\\u744f\\u7450\\u7451\\u7452\\u7453\\u7454\\u7455\\u7456\\u7457\\u7458\\u7459\\u745a\\u745b\\u745c\\u745d\\u745e\\u745f\\u7460\\u7461\\u7462\\u7463\\u7464\\u7465\\u7466\\u7467\\u7468\\u7469\\u746a\\u746b\\u746c\\u746d\\u746e\\u746f\\u7470\\u7471\\u7472\\u7473\\u7474\\u7475\\u7476\\u7477\\u7478\\u7479\\u747a\\u747b\\u747c\\u747d\\u747e\\u747f\\u7480\\u7481\\u7482\\u7483\\u7484\\u7485\\u7486\\u7487\\u7488\\u7489\\u748a\\u748b\\u748c\\u748d\\u748e\\u748f\\u7490\\u7491\\u7492\\u7493\\u7494\\u7495\\u7496\\u7497\\u7498\\u7499\\u749a\\u749b\\u749c\\u749d\\u749e\\u749f\\u74a0\\u74a1\\u74a2\\u74a3\\u74a4\\u74a5\\u74a6\\u74a7\\u74a8\\u74a9\\u74aa\\u74ab\\u74ac\\u74ad\\u74ae\\u74af\\u74b0\\u74b1\\u74b2\\u74b3\\u74b4\\u74b5\\u74b6\\u74b7\\u74b8\\u74b9\\u74ba\\u74bb\\u74bc\\u74bd\\u74be\\u74bf\\u74c0\\u74c1\\u74c2\\u74c3\\u74c4\\u74c5\\u74c6\\u74c7\\u74c8\\u74c9\\u74ca\\u74cb\\u74cc\\u74cd\\u74ce\\u74cf\\u74d0\\u74d1\\u74d2\\u74d3\\u74d4\\u74d5\\u74d6\\u74d7\\u74d8\\u74d9\\u74da\\u74db\\u74dc\\u74dd\\u74de\\u74df\\u74e0\\u74e1\\u74e2\\u74e3\\u74e4\\u74e5\\u74e6\\u74e7\\u74e8\\u74e9\\u74ea\\u74eb\\u74ec\\u74ed\\u74ee\\u74ef\\u74f0\\u74f1\\u74f2\\u74f3\\u74f4\\u74f5\\u74f6\\u74f7\\u74f8\\u74f9\\u74fa\\u74fb\\u74fc\\u74fd\\u74fe\\u74ff\\u7500\\u7501\\u7502\\u7503\\u7504\\u7505\\u7506\\u7507\\u7508\\u7509\\u750a\\u750b\\u750c\\u750d\\u750e\\u750f\\u7510\\u7511\\u7512\\u7513\\u7514\\u7515\\u7516\\u7517\\u7518\\u7519\\u751a\\u751b\\u751c\\u751d\\u751e\\u751f\\u7520\\u7521\\u7522\\u7523\\u7524\\u7525\\u7526\\u7527\\u7528\\u7529\\u752a\\u752b\\u752c\\u752d\\u752e\\u752f\\u7530\\u7531\\u7532\\u7533\\u7534\\u7535\\u7536\\u7537\\u7538\\u7539\\u753a\\u753b\\u753c\\u753d\\u753e\\u753f\\u7540\\u7541\\u7542\\u7543\\u7544\\u7545\\u7546\\u7547\\u7548\\u7549\\u754a\\u754b\\u754c\\u754d\\u754e\\u754f\\u7550\\u7551\\u7552\\u7553\\u7554\\u7555\\u7556\\u7557\\u7558\\u7559\\u755a\\u755b\\u755c\\u755d\\u755e\\u755f\\u7560\\u7561\\u7562\\u7563\\u7564\\u7565\\u7566\\u7567\\u7568\\u7569\\u756a\\u756b\\u756c\\u756d\\u756e\\u756f\\u7570\\u7571\\u7572\\u7573\\u7574\\u7575\\u7576\\u7577\\u7578\\u7579\\u757a\\u757b\\u757c\\u757d\\u757e\\u757f\\u7580\\u7581\\u7582\\u7583\\u7584\\u7585\\u7586\\u7587\\u7588\\u7589\\u758a\\u758b\\u758c\\u758d\\u758e\\u758f\\u7590\\u7591\\u7592\\u7593\\u7594\\u7595\\u7596\\u7597\\u7598\\u7599\\u759a\\u759b\\u759c\\u759d\\u759e\\u759f\\u75a0\\u75a1\\u75a2\\u75a3\\u75a4\\u75a5\\u75a6\\u75a7\\u75a8\\u75a9\\u75aa\\u75ab\\u75ac\\u75ad\\u75ae\\u75af\\u75b0\\u75b1\\u75b2\\u75b3\\u75b4\\u75b5\\u75b6\\u75b7\\u75b8\\u75b9\\u75ba\\u75bb\\u75bc\\u75bd\\u75be\\u75bf\\u75c0\\u75c1\\u75c2\\u75c3\\u75c4\\u75c5\\u75c6\\u75c7\\u75c8\\u75c9\\u75ca\\u75cb\\u75cc\\u75cd\\u75ce\\u75cf\\u75d0\\u75d1\\u75d2\\u75d3\\u75d4\\u75d5\\u75d6\\u75d7\\u75d8\\u75d9\\u75da\\u75db\\u75dc\\u75dd\\u75de\\u75df\\u75e0\\u75e1\\u75e2\\u75e3\\u75e4\\u75e5\\u75e6\\u75e7\\u75e8\\u75e9\\u75ea\\u75eb\\u75ec\\u75ed\\u75ee\\u75ef\\u75f0\\u75f1\\u75f2\\u75f3\\u75f4\\u75f5\\u75f6\\u75f7\\u75f8\\u75f9\\u75fa\\u75fb\\u75fc\\u75fd\\u75fe\\u75ff\\u7600\\u7601\\u7602\\u7603\\u7604\\u7605\\u7606\\u7607\\u7608\\u7609\\u760a\\u760b\\u760c\\u760d\\u760e\\u760f\\u7610\\u7611\\u7612\\u7613\\u7614\\u7615\\u7616\\u7617\\u7618\\u7619\\u761a\\u761b\\u761c\\u761d\\u761e\\u761f\\u7620\\u7621\\u7622\\u7623\\u7624\\u7625\\u7626\\u7627\\u7628\\u7629\\u762a\\u762b\\u762c\\u762d\\u762e\\u762f\\u7630\\u7631\\u7632\\u7633\\u7634\\u7635\\u7636\\u7637\\u7638\\u7639\\u763a\\u763b\\u763c\\u763d\\u763e\\u763f\\u7640\\u7641\\u7642\\u7643\\u7644\\u7645\\u7646\\u7647\\u7648\\u7649\\u764a\\u764b\\u764c\\u764d\\u764e\\u764f\\u7650\\u7651\\u7652\\u7653\\u7654\\u7655\\u7656\\u7657\\u7658\\u7659\\u765a\\u765b\\u765c\\u765d\\u765e\\u765f\\u7660\\u7661\\u7662\\u7663\\u7664\\u7665\\u7666\\u7667\\u7668\\u7669\\u766a\\u766b\\u766c\\u766d\\u766e\\u766f\\u7670\\u7671\\u7672\\u7673\\u7674\\u7675\\u7676\\u7677\\u7678\\u7679\\u767a\\u767b\\u767c\\u767d\\u767e\\u767f\\u7680\\u7681\\u7682\\u7683\\u7684\\u7685\\u7686\\u7687\\u7688\\u7689\\u768a\\u768b\\u768c\\u768d\\u768e\\u768f\\u7690\\u7691\\u7692\\u7693\\u7694\\u7695\\u7696\\u7697\\u7698\\u7699\\u769a\\u769b\\u769c\\u769d\\u769e\\u769f\\u76a0\\u76a1\\u76a2\\u76a3\\u76a4\\u76a5\\u76a6\\u76a7\\u76a8\\u76a9\\u76aa\\u76ab\\u76ac\\u76ad\\u76ae\\u76af\\u76b0\\u76b1\\u76b2\\u76b3\\u76b4\\u76b5\\u76b6\\u76b7\\u76b8\\u76b9\\u76ba\\u76bb\\u76bc\\u76bd\\u76be\\u76bf\\u76c0\\u76c1\\u76c2\\u76c3\\u76c4\\u76c5\\u76c6\\u76c7\\u76c8\\u76c9\\u76ca\\u76cb\\u76cc\\u76cd\\u76ce\\u76cf\\u76d0\\u76d1\\u76d2\\u76d3\\u76d4\\u76d5\\u76d6\\u76d7\\u76d8\\u76d9\\u76da\\u76db\\u76dc\\u76dd\\u76de\\u76df\\u76e0\\u76e1\\u76e2\\u76e3\\u76e4\\u76e5\\u76e6\\u76e7\\u76e8\\u76e9\\u76ea\\u76eb\\u76ec\\u76ed\\u76ee\\u76ef\\u76f0\\u76f1\\u76f2\\u76f3\\u76f4\\u76f5\\u76f6\\u76f7\\u76f8\\u76f9\\u76fa\\u76fb\\u76fc\\u76fd\\u76fe\\u76ff\\u7700\\u7701\\u7702\\u7703\\u7704\\u7705\\u7706\\u7707\\u7708\\u7709\\u770a\\u770b\\u770c\\u770d\\u770e\\u770f\\u7710\\u7711\\u7712\\u7713\\u7714\\u7715\\u7716\\u7717\\u7718\\u7719\\u771a\\u771b\\u771c\\u771d\\u771e\\u771f\\u7720\\u7721\\u7722\\u7723\\u7724\\u7725\\u7726\\u7727\\u7728\\u7729\\u772a\\u772b\\u772c\\u772d\\u772e\\u772f\\u7730\\u7731\\u7732\\u7733\\u7734\\u7735\\u7736\\u7737\\u7738\\u7739\\u773a\\u773b\\u773c\\u773d\\u773e\\u773f\\u7740\\u7741\\u7742\\u7743\\u7744\\u7745\\u7746\\u7747\\u7748\\u7749\\u774a\\u774b\\u774c\\u774d\\u774e\\u774f\\u7750\\u7751\\u7752\\u7753\\u7754\\u7755\\u7756\\u7757\\u7758\\u7759\\u775a\\u775b\\u775c\\u775d\\u775e\\u775f\\u7760\\u7761\\u7762\\u7763\\u7764\\u7765\\u7766\\u7767\\u7768\\u7769\\u776a\\u776b\\u776c\\u776d\\u776e\\u776f\\u7770\\u7771\\u7772\\u7773\\u7774\\u7775\\u7776\\u7777\\u7778\\u7779\\u777a\\u777b\\u777c\\u777d\\u777e\\u777f\\u7780\\u7781\\u7782\\u7783\\u7784\\u7785\\u7786\\u7787\\u7788\\u7789\\u778a\\u778b\\u778c\\u778d\\u778e\\u778f\\u7790\\u7791\\u7792\\u7793\\u7794\\u7795\\u7796\\u7797\\u7798\\u7799\\u779a\\u779b\\u779c\\u779d\\u779e\\u779f\\u77a0\\u77a1\\u77a2\\u77a3\\u77a4\\u77a5\\u77a6\\u77a7\\u77a8\\u77a9\\u77aa\\u77ab\\u77ac\\u77ad\\u77ae\\u77af\\u77b0\\u77b1\\u77b2\\u77b3\\u77b4\\u77b5\\u77b6\\u77b7\\u77b8\\u77b9\\u77ba\\u77bb\\u77bc\\u77bd\\u77be\\u77bf\\u77c0\\u77c1\\u77c2\\u77c3\\u77c4\\u77c5\\u77c6\\u77c7\\u77c8\\u77c9\\u77ca\\u77cb\\u77cc\\u77cd\\u77ce\\u77cf\\u77d0\\u77d1\\u77d2\\u77d3\\u77d4\\u77d5\\u77d6\\u77d7\\u77d8\\u77d9\\u77da\\u77db\\u77dc\\u77dd\\u77de\\u77df\\u77e0\\u77e1\\u77e2\\u77e3\\u77e4\\u77e5\\u77e6\\u77e7\\u77e8\\u77e9\\u77ea\\u77eb\\u77ec\\u77ed\\u77ee\\u77ef\\u77f0\\u77f1\\u77f2\\u77f3\\u77f4\\u77f5\\u77f6\\u77f7\\u77f8\\u77f9\\u77fa\\u77fb\\u77fc\\u77fd\\u77fe\\u77ff\\u7800\\u7801\\u7802\\u7803\\u7804\\u7805\\u7806\\u7807\\u7808\\u7809\\u780a\\u780b\\u780c\\u780d\\u780e\\u780f\\u7810\\u7811\\u7812\\u7813\\u7814\\u7815\\u7816\\u7817\\u7818\\u7819\\u781a\\u781b\\u781c\\u781d\\u781e\\u781f\\u7820\\u7821\\u7822\\u7823\\u7824\\u7825\\u7826\\u7827\\u7828\\u7829\\u782a\\u782b\\u782c\\u782d\\u782e\\u782f\\u7830\\u7831\\u7832\\u7833\\u7834\\u7835\\u7836\\u7837\\u7838\\u7839\\u783a\\u783b\\u783c\\u783d\\u783e\\u783f\\u7840\\u7841\\u7842\\u7843\\u7844\\u7845\\u7846\\u7847\\u7848\\u7849\\u784a\\u784b\\u784c\\u784d\\u784e\\u784f\\u7850\\u7851\\u7852\\u7853\\u7854\\u7855\\u7856\\u7857\\u7858\\u7859\\u785a\\u785b\\u785c\\u785d\\u785e\\u785f\\u7860\\u7861\\u7862\\u7863\\u7864\\u7865\\u7866\\u7867\\u7868\\u7869\\u786a\\u786b\\u786c\\u786d\\u786e\\u786f\\u7870\\u7871\\u7872\\u7873\\u7874\\u7875\\u7876\\u7877\\u7878\\u7879\\u787a\\u787b\\u787c\\u787d\\u787e\\u787f\\u7880\\u7881\\u7882\\u7883\\u7884\\u7885\\u7886\\u7887\\u7888\\u7889\\u788a\\u788b\\u788c\\u788d\\u788e\\u788f\\u7890\\u7891\\u7892\\u7893\\u7894\\u7895\\u7896\\u7897\\u7898\\u7899\\u789a\\u789b\\u789c\\u789d\\u789e\\u789f\\u78a0\\u78a1\\u78a2\\u78a3\\u78a4\\u78a5\\u78a6\\u78a7\\u78a8\\u78a9\\u78aa\\u78ab\\u78ac\\u78ad\\u78ae\\u78af\\u78b0\\u78b1\\u78b2\\u78b3\\u78b4\\u78b5\\u78b6\\u78b7\\u78b8\\u78b9\\u78ba\\u78bb\\u78bc\\u78bd\\u78be\\u78bf\\u78c0\\u78c1\\u78c2\\u78c3\\u78c4\\u78c5\\u78c6\\u78c7\\u78c8\\u78c9\\u78ca\\u78cb\\u78cc\\u78cd\\u78ce\\u78cf\\u78d0\\u78d1\\u78d2\\u78d3\\u78d4\\u78d5\\u78d6\\u78d7\\u78d8\\u78d9\\u78da\\u78db\\u78dc\\u78dd\\u78de\\u78df\\u78e0\\u78e1\\u78e2\\u78e3\\u78e4\\u78e5\\u78e6\\u78e7\\u78e8\\u78e9\\u78ea\\u78eb\\u78ec\\u78ed\\u78ee\\u78ef\\u78f0\\u78f1\\u78f2\\u78f3\\u78f4\\u78f5\\u78f6\\u78f7\\u78f8\\u78f9\\u78fa\\u78fb\\u78fc\\u78fd\\u78fe\\u78ff\\u7900\\u7901\\u7902\\u7903\\u7904\\u7905\\u7906\\u7907\\u7908\\u7909\\u790a\\u790b\\u790c\\u790d\\u790e\\u790f\\u7910\\u7911\\u7912\\u7913\\u7914\\u7915\\u7916\\u7917\\u7918\\u7919\\u791a\\u791b\\u791c\\u791d\\u791e\\u791f\\u7920\\u7921\\u7922\\u7923\\u7924\\u7925\\u7926\\u7927\\u7928\\u7929\\u792a\\u792b\\u792c\\u792d\\u792e\\u792f\\u7930\\u7931\\u7932\\u7933\\u7934\\u7935\\u7936\\u7937\\u7938\\u7939\\u793a\\u793b\\u793c\\u793d\\u793e\\u793f\\u7940\\u7941\\u7942\\u7943\\u7944\\u7945\\u7946\\u7947\\u7948\\u7949\\u794a\\u794b\\u794c\\u794d\\u794e\\u794f\\u7950\\u7951\\u7952\\u7953\\u7954\\u7955\\u7956\\u7957\\u7958\\u7959\\u795a\\u795b\\u795c\\u795d\\u795e\\u795f\\u7960\\u7961\\u7962\\u7963\\u7964\\u7965\\u7966\\u7967\\u7968\\u7969\\u796a\\u796b\\u796c\\u796d\\u796e\\u796f\\u7970\\u7971\\u7972\\u7973\\u7974\\u7975\\u7976\\u7977\\u7978\\u7979\\u797a\\u797b\\u797c\\u797d\\u797e\\u797f\\u7980\\u7981\\u7982\\u7983\\u7984\\u7985\\u7986\\u7987\\u7988\\u7989\\u798a\\u798b\\u798c\\u798d\\u798e\\u798f\\u7990\\u7991\\u7992\\u7993\\u7994\\u7995\\u7996\\u7997\\u7998\\u7999\\u799a\\u799b\\u799c\\u799d\\u799e\\u799f\\u79a0\\u79a1\\u79a2\\u79a3\\u79a4\\u79a5\\u79a6\\u79a7\\u79a8\\u79a9\\u79aa\\u79ab\\u79ac\\u79ad\\u79ae\\u79af\\u79b0\\u79b1\\u79b2\\u79b3\\u79b4\\u79b5\\u79b6\\u79b7\\u79b8\\u79b9\\u79ba\\u79bb\\u79bc\\u79bd\\u79be\\u79bf\\u79c0\\u79c1\\u79c2\\u79c3\\u79c4\\u79c5\\u79c6\\u79c7\\u79c8\\u79c9\\u79ca\\u79cb\\u79cc\\u79cd\\u79ce\\u79cf\\u79d0\\u79d1\\u79d2\\u79d3\\u79d4\\u79d5\\u79d6\\u79d7\\u79d8\\u79d9\\u79da\\u79db\\u79dc\\u79dd\\u79de\\u79df\\u79e0\\u79e1\\u79e2\\u79e3\\u79e4\\u79e5\\u79e6\\u79e7\\u79e8\\u79e9\\u79ea\\u79eb\\u79ec\\u79ed\\u79ee\\u79ef\\u79f0\\u79f1\\u79f2\\u79f3\\u79f4\\u79f5\\u79f6\\u79f7\\u79f8\\u79f9\\u79fa\\u79fb\\u79fc\\u79fd\\u79fe\\u79ff\\u7a00\\u7a01\\u7a02\\u7a03\\u7a04\\u7a05\\u7a06\\u7a07\\u7a08\\u7a09\\u7a0a\\u7a0b\\u7a0c\\u7a0d\\u7a0e\\u7a0f\\u7a10\\u7a11\\u7a12\\u7a13\\u7a14\\u7a15\\u7a16\\u7a17\\u7a18\\u7a19\\u7a1a\\u7a1b\\u7a1c\\u7a1d\\u7a1e\\u7a1f\\u7a20\\u7a21\\u7a22\\u7a23\\u7a24\\u7a25\\u7a26\\u7a27\\u7a28\\u7a29\\u7a2a\\u7a2b\\u7a2c\\u7a2d\\u7a2e\\u7a2f\\u7a30\\u7a31\\u7a32\\u7a33\\u7a34\\u7a35\\u7a36\\u7a37\\u7a38\\u7a39\\u7a3a\\u7a3b\\u7a3c\\u7a3d\\u7a3e\\u7a3f\\u7a40\\u7a41\\u7a42\\u7a43\\u7a44\\u7a45\\u7a46\\u7a47\\u7a48\\u7a49\\u7a4a\\u7a4b\\u7a4c\\u7a4d\\u7a4e\\u7a4f\\u7a50\\u7a51\\u7a52\\u7a53\\u7a54\\u7a55\\u7a56\\u7a57\\u7a58\\u7a59\\u7a5a\\u7a5b\\u7a5c\\u7a5d\\u7a5e\\u7a5f\\u7a60\\u7a61\\u7a62\\u7a63\\u7a64\\u7a65\\u7a66\\u7a67\\u7a68\\u7a69\\u7a6a\\u7a6b\\u7a6c\\u7a6d\\u7a6e\\u7a6f\\u7a70\\u7a71\\u7a72\\u7a73\\u7a74\\u7a75\\u7a76\\u7a77\\u7a78\\u7a79\\u7a7a\\u7a7b\\u7a7c\\u7a7d\\u7a7e\\u7a7f\\u7a80\\u7a81\\u7a82\\u7a83\\u7a84\\u7a85\\u7a86\\u7a87\\u7a88\\u7a89\\u7a8a\\u7a8b\\u7a8c\\u7a8d\\u7a8e\\u7a8f\\u7a90\\u7a91\\u7a92\\u7a93\\u7a94\\u7a95\\u7a96\\u7a97\\u7a98\\u7a99\\u7a9a\\u7a9b\\u7a9c\\u7a9d\\u7a9e\\u7a9f\\u7aa0\\u7aa1\\u7aa2\\u7aa3\\u7aa4\\u7aa5\\u7aa6\\u7aa7\\u7aa8\\u7aa9\\u7aaa\\u7aab\\u7aac\\u7aad\\u7aae\\u7aaf\\u7ab0\\u7ab1\\u7ab2\\u7ab3\\u7ab4\\u7ab5\\u7ab6\\u7ab7\\u7ab8\\u7ab9\\u7aba\\u7abb\\u7abc\\u7abd\\u7abe\\u7abf\\u7ac0\\u7ac1\\u7ac2\\u7ac3\\u7ac4\\u7ac5\\u7ac6\\u7ac7\\u7ac8\\u7ac9\\u7aca\\u7acb\\u7acc\\u7acd\\u7ace\\u7acf\\u7ad0\\u7ad1\\u7ad2\\u7ad3\\u7ad4\\u7ad5\\u7ad6\\u7ad7\\u7ad8\\u7ad9\\u7ada\\u7adb\\u7adc\\u7add\\u7ade\\u7adf\\u7ae0\\u7ae1\\u7ae2\\u7ae3\\u7ae4\\u7ae5\\u7ae6\\u7ae7\\u7ae8\\u7ae9\\u7aea\\u7aeb\\u7aec\\u7aed\\u7aee\\u7aef\\u7af0\\u7af1\\u7af2\\u7af3\\u7af4\\u7af5\\u7af6\\u7af7\\u7af8\\u7af9\\u7afa\\u7afb\\u7afc\\u7afd\\u7afe\\u7aff\\u7b00\\u7b01\\u7b02\\u7b03\\u7b04\\u7b05\\u7b06\\u7b07\\u7b08\\u7b09\\u7b0a\\u7b0b\\u7b0c\\u7b0d\\u7b0e\\u7b0f\\u7b10\\u7b11\\u7b12\\u7b13\\u7b14\\u7b15\\u7b16\\u7b17\\u7b18\\u7b19\\u7b1a\\u7b1b\\u7b1c\\u7b1d\\u7b1e\\u7b1f\\u7b20\\u7b21\\u7b22\\u7b23\\u7b24\\u7b25\\u7b26\\u7b27\\u7b28\\u7b29\\u7b2a\\u7b2b\\u7b2c\\u7b2d\\u7b2e\\u7b2f\\u7b30\\u7b31\\u7b32\\u7b33\\u7b34\\u7b35\\u7b36\\u7b37\\u7b38\\u7b39\\u7b3a\\u7b3b\\u7b3c\\u7b3d\\u7b3e\\u7b3f\\u7b40\\u7b41\\u7b42\\u7b43\\u7b44\\u7b45\\u7b46\\u7b47\\u7b48\\u7b49\\u7b4a\\u7b4b\\u7b4c\\u7b4d\\u7b4e\\u7b4f\\u7b50\\u7b51\\u7b52\\u7b53\\u7b54\\u7b55\\u7b56\\u7b57\\u7b58\\u7b59\\u7b5a\\u7b5b\\u7b5c\\u7b5d\\u7b5e\\u7b5f\\u7b60\\u7b61\\u7b62\\u7b63\\u7b64\\u7b65\\u7b66\\u7b67\\u7b68\\u7b69\\u7b6a\\u7b6b\\u7b6c\\u7b6d\\u7b6e\\u7b6f\\u7b70\\u7b71\\u7b72\\u7b73\\u7b74\\u7b75\\u7b76\\u7b77\\u7b78\\u7b79\\u7b7a\\u7b7b\\u7b7c\\u7b7d\\u7b7e\\u7b7f\\u7b80\\u7b81\\u7b82\\u7b83\\u7b84\\u7b85\\u7b86\\u7b87\\u7b88\\u7b89\\u7b8a\\u7b8b\\u7b8c\\u7b8d\\u7b8e\\u7b8f\\u7b90\\u7b91\\u7b92\\u7b93\\u7b94\\u7b95\\u7b96\\u7b97\\u7b98\\u7b99\\u7b9a\\u7b9b\\u7b9c\\u7b9d\\u7b9e\\u7b9f\\u7ba0\\u7ba1\\u7ba2\\u7ba3\\u7ba4\\u7ba5\\u7ba6\\u7ba7\\u7ba8\\u7ba9\\u7baa\\u7bab\\u7bac\\u7bad\\u7bae\\u7baf\\u7bb0\\u7bb1\\u7bb2\\u7bb3\\u7bb4\\u7bb5\\u7bb6\\u7bb7\\u7bb8\\u7bb9\\u7bba\\u7bbb\\u7bbc\\u7bbd\\u7bbe\\u7bbf\\u7bc0\\u7bc1\\u7bc2\\u7bc3\\u7bc4\\u7bc5\\u7bc6\\u7bc7\\u7bc8\\u7bc9\\u7bca\\u7bcb\\u7bcc\\u7bcd\\u7bce\\u7bcf\\u7bd0\\u7bd1\\u7bd2\\u7bd3\\u7bd4\\u7bd5\\u7bd6\\u7bd7\\u7bd8\\u7bd9\\u7bda\\u7bdb\\u7bdc\\u7bdd\\u7bde\\u7bdf\\u7be0\\u7be1\\u7be2\\u7be3\\u7be4\\u7be5\\u7be6\\u7be7\\u7be8\\u7be9\\u7bea\\u7beb\\u7bec\\u7bed\\u7bee\\u7bef\\u7bf0\\u7bf1\\u7bf2\\u7bf3\\u7bf4\\u7bf5\\u7bf6\\u7bf7\\u7bf8\\u7bf9\\u7bfa\\u7bfb\\u7bfc\\u7bfd\\u7bfe\\u7bff\\u7c00\\u7c01\\u7c02\\u7c03\\u7c04\\u7c05\\u7c06\\u7c07\\u7c08\\u7c09\\u7c0a\\u7c0b\\u7c0c\\u7c0d\\u7c0e\\u7c0f\\u7c10\\u7c11\\u7c12\\u7c13\\u7c14\\u7c15\\u7c16\\u7c17\\u7c18\\u7c19\\u7c1a\\u7c1b\\u7c1c\\u7c1d\\u7c1e\\u7c1f\\u7c20\\u7c21\\u7c22\\u7c23\\u7c24\\u7c25\\u7c26\\u7c27\\u7c28\\u7c29\\u7c2a\\u7c2b\\u7c2c\\u7c2d\\u7c2e\\u7c2f\\u7c30\\u7c31\\u7c32\\u7c33\\u7c34\\u7c35\\u7c36\\u7c37\\u7c38\\u7c39\\u7c3a\\u7c3b\\u7c3c\\u7c3d\\u7c3e\\u7c3f\\u7c40\\u7c41\\u7c42\\u7c43\\u7c44\\u7c45\\u7c46\\u7c47\\u7c48\\u7c49\\u7c4a\\u7c4b\\u7c4c\\u7c4d\\u7c4e\\u7c4f\\u7c50\\u7c51\\u7c52\\u7c53\\u7c54\\u7c55\\u7c56\\u7c57\\u7c58\\u7c59\\u7c5a\\u7c5b\\u7c5c\\u7c5d\\u7c5e\\u7c5f\\u7c60\\u7c61\\u7c62\\u7c63\\u7c64\\u7c65\\u7c66\\u7c67\\u7c68\\u7c69\\u7c6a\\u7c6b\\u7c6c\\u7c6d\\u7c6e\\u7c6f\\u7c70\\u7c71\\u7c72\\u7c73\\u7c74\\u7c75\\u7c76\\u7c77\\u7c78\\u7c79\\u7c7a\\u7c7b\\u7c7c\\u7c7d\\u7c7e\\u7c7f\\u7c80\\u7c81\\u7c82\\u7c83\\u7c84\\u7c85\\u7c86\\u7c87\\u7c88\\u7c89\\u7c8a\\u7c8b\\u7c8c\\u7c8d\\u7c8e\\u7c8f\\u7c90\\u7c91\\u7c92\\u7c93\\u7c94\\u7c95\\u7c96\\u7c97\\u7c98\\u7c99\\u7c9a\\u7c9b\\u7c9c\\u7c9d\\u7c9e\\u7c9f\\u7ca0\\u7ca1\\u7ca2\\u7ca3\\u7ca4\\u7ca5\\u7ca6\\u7ca7\\u7ca8\\u7ca9\\u7caa\\u7cab\\u7cac\\u7cad\\u7cae\\u7caf\\u7cb0\\u7cb1\\u7cb2\\u7cb3\\u7cb4\\u7cb5\\u7cb6\\u7cb7\\u7cb8\\u7cb9\\u7cba\\u7cbb\\u7cbc\\u7cbd\\u7cbe\\u7cbf\\u7cc0\\u7cc1\\u7cc2\\u7cc3\\u7cc4\\u7cc5\\u7cc6\\u7cc7\\u7cc8\\u7cc9\\u7cca\\u7ccb\\u7ccc\\u7ccd\\u7cce\\u7ccf\\u7cd0\\u7cd1\\u7cd2\\u7cd3\\u7cd4\\u7cd5\\u7cd6\\u7cd7\\u7cd8\\u7cd9\\u7cda\\u7cdb\\u7cdc\\u7cdd\\u7cde\\u7cdf\\u7ce0\\u7ce1\\u7ce2\\u7ce3\\u7ce4\\u7ce5\\u7ce6\\u7ce7\\u7ce8\\u7ce9\\u7cea\\u7ceb\\u7cec\\u7ced\\u7cee\\u7cef\\u7cf0\\u7cf1\\u7cf2\\u7cf3\\u7cf4\\u7cf5\\u7cf6\\u7cf7\\u7cf8\\u7cf9\\u7cfa\\u7cfb\\u7cfc\\u7cfd\\u7cfe\\u7cff\\u7d00\\u7d01\\u7d02\\u7d03\\u7d04\\u7d05\\u7d06\\u7d07\\u7d08\\u7d09\\u7d0a\\u7d0b\\u7d0c\\u7d0d\\u7d0e\\u7d0f\\u7d10\\u7d11\\u7d12\\u7d13\\u7d14\\u7d15\\u7d16\\u7d17\\u7d18\\u7d19\\u7d1a\\u7d1b\\u7d1c\\u7d1d\\u7d1e\\u7d1f\\u7d20\\u7d21\\u7d22\\u7d23\\u7d24\\u7d25\\u7d26\\u7d27\\u7d28\\u7d29\\u7d2a\\u7d2b\\u7d2c\\u7d2d\\u7d2e\\u7d2f\\u7d30\\u7d31\\u7d32\\u7d33\\u7d34\\u7d35\\u7d36\\u7d37\\u7d38\\u7d39\\u7d3a\\u7d3b\\u7d3c\\u7d3d\\u7d3e\\u7d3f\\u7d40\\u7d41\\u7d42\\u7d43\\u7d44\\u7d45\\u7d46\\u7d47\\u7d48\\u7d49\\u7d4a\\u7d4b\\u7d4c\\u7d4d\\u7d4e\\u7d4f\\u7d50\\u7d51\\u7d52\\u7d53\\u7d54\\u7d55\\u7d56\\u7d57\\u7d58\\u7d59\\u7d5a\\u7d5b\\u7d5c\\u7d5d\\u7d5e\\u7d5f\\u7d60\\u7d61\\u7d62\\u7d63\\u7d64\\u7d65\\u7d66\\u7d67\\u7d68\\u7d69\\u7d6a\\u7d6b\\u7d6c\\u7d6d\\u7d6e\\u7d6f\\u7d70\\u7d71\\u7d72\\u7d73\\u7d74\\u7d75\\u7d76\\u7d77\\u7d78\\u7d79\\u7d7a\\u7d7b\\u7d7c\\u7d7d\\u7d7e\\u7d7f\\u7d80\\u7d81\\u7d82\\u7d83\\u7d84\\u7d85\\u7d86\\u7d87\\u7d88\\u7d89\\u7d8a\\u7d8b\\u7d8c\\u7d8d\\u7d8e\\u7d8f\\u7d90\\u7d91\\u7d92\\u7d93\\u7d94\\u7d95\\u7d96\\u7d97\\u7d98\\u7d99\\u7d9a\\u7d9b\\u7d9c\\u7d9d\\u7d9e\\u7d9f\\u7da0\\u7da1\\u7da2\\u7da3\\u7da4\\u7da5\\u7da6\\u7da7\\u7da8\\u7da9\\u7daa\\u7dab\\u7dac\\u7dad\\u7dae\\u7daf\\u7db0\\u7db1\\u7db2\\u7db3\\u7db4\\u7db5\\u7db6\\u7db7\\u7db8\\u7db9\\u7dba\\u7dbb\\u7dbc\\u7dbd\\u7dbe\\u7dbf\\u7dc0\\u7dc1\\u7dc2\\u7dc3\\u7dc4\\u7dc5\\u7dc6\\u7dc7\\u7dc8\\u7dc9\\u7dca\\u7dcb\\u7dcc\\u7dcd\\u7dce\\u7dcf\\u7dd0\\u7dd1\\u7dd2\\u7dd3\\u7dd4\\u7dd5\\u7dd6\\u7dd7\\u7dd8\\u7dd9\\u7dda\\u7ddb\\u7ddc\\u7ddd\\u7dde\\u7ddf\\u7de0\\u7de1\\u7de2\\u7de3\\u7de4\\u7de5\\u7de6\\u7de7\\u7de8\\u7de9\\u7dea\\u7deb\\u7dec\\u7ded\\u7dee\\u7def\\u7df0\\u7df1\\u7df2\\u7df3\\u7df4\\u7df5\\u7df6\\u7df7\\u7df8\\u7df9\\u7dfa\\u7dfb\\u7dfc\\u7dfd\\u7dfe\\u7dff\\u7e00\\u7e01\\u7e02\\u7e03\\u7e04\\u7e05\\u7e06\\u7e07\\u7e08\\u7e09\\u7e0a\\u7e0b\\u7e0c\\u7e0d\\u7e0e\\u7e0f\\u7e10\\u7e11\\u7e12\\u7e13\\u7e14\\u7e15\\u7e16\\u7e17\\u7e18\\u7e19\\u7e1a\\u7e1b\\u7e1c\\u7e1d\\u7e1e\\u7e1f\\u7e20\\u7e21\\u7e22\\u7e23\\u7e24\\u7e25\\u7e26\\u7e27\\u7e28\\u7e29\\u7e2a\\u7e2b\\u7e2c\\u7e2d\\u7e2e\\u7e2f\\u7e30\\u7e31\\u7e32\\u7e33\\u7e34\\u7e35\\u7e36\\u7e37\\u7e38\\u7e39\\u7e3a\\u7e3b\\u7e3c\\u7e3d\\u7e3e\\u7e3f\\u7e40\\u7e41\\u7e42\\u7e43\\u7e44\\u7e45\\u7e46\\u7e47\\u7e48\\u7e49\\u7e4a\\u7e4b\\u7e4c\\u7e4d\\u7e4e\\u7e4f\\u7e50\\u7e51\\u7e52\\u7e53\\u7e54\\u7e55\\u7e56\\u7e57\\u7e58\\u7e59\\u7e5a\\u7e5b\\u7e5c\\u7e5d\\u7e5e\\u7e5f\\u7e60\\u7e61\\u7e62\\u7e63\\u7e64\\u7e65\\u7e66\\u7e67\\u7e68\\u7e69\\u7e6a\\u7e6b\\u7e6c\\u7e6d\\u7e6e\\u7e6f\\u7e70\\u7e71\\u7e72\\u7e73\\u7e74\\u7e75\\u7e76\\u7e77\\u7e78\\u7e79\\u7e7a\\u7e7b\\u7e7c\\u7e7d\\u7e7e\\u7e7f\\u7e80\\u7e81\\u7e82\\u7e83\\u7e84\\u7e85\\u7e86\\u7e87\\u7e88\\u7e89\\u7e8a\\u7e8b\\u7e8c\\u7e8d\\u7e8e\\u7e8f\\u7e90\\u7e91\\u7e92\\u7e93\\u7e94\\u7e95\\u7e96\\u7e97\\u7e98\\u7e99\\u7e9a\\u7e9b\\u7e9c\\u7e9d\\u7e9e\\u7e9f\\u7ea0\\u7ea1\\u7ea2\\u7ea3\\u7ea4\\u7ea5\\u7ea6\\u7ea7\\u7ea8\\u7ea9\\u7eaa\\u7eab\\u7eac\\u7ead\\u7eae\\u7eaf\\u7eb0\\u7eb1\\u7eb2\\u7eb3\\u7eb4\\u7eb5\\u7eb6\\u7eb7\\u7eb8\\u7eb9\\u7eba\\u7ebb\\u7ebc\\u7ebd\\u7ebe\\u7ebf\\u7ec0\\u7ec1\\u7ec2\\u7ec3\\u7ec4\\u7ec5\\u7ec6\\u7ec7\\u7ec8\\u7ec9\\u7eca\\u7ecb\\u7ecc\\u7ecd\\u7ece\\u7ecf\\u7ed0\\u7ed1\\u7ed2\\u7ed3\\u7ed4\\u7ed5\\u7ed6\\u7ed7\\u7ed8\\u7ed9\\u7eda\\u7edb\\u7edc\\u7edd\\u7ede\\u7edf\\u7ee0\\u7ee1\\u7ee2\\u7ee3\\u7ee4\\u7ee5\\u7ee6\\u7ee7\\u7ee8\\u7ee9\\u7eea\\u7eeb\\u7eec\\u7eed\\u7eee\\u7eef\\u7ef0\\u7ef1\\u7ef2\\u7ef3\\u7ef4\\u7ef5\\u7ef6\\u7ef7\\u7ef8\\u7ef9\\u7efa\\u7efb\\u7efc\\u7efd\\u7efe\\u7eff\\u7f00\\u7f01\\u7f02\\u7f03\\u7f04\\u7f05\\u7f06\\u7f07\\u7f08\\u7f09\\u7f0a\\u7f0b\\u7f0c\\u7f0d\\u7f0e\\u7f0f\\u7f10\\u7f11\\u7f12\\u7f13\\u7f14\\u7f15\\u7f16\\u7f17\\u7f18\\u7f19\\u7f1a\\u7f1b\\u7f1c\\u7f1d\\u7f1e\\u7f1f\\u7f20\\u7f21\\u7f22\\u7f23\\u7f24\\u7f25\\u7f26\\u7f27\\u7f28\\u7f29\\u7f2a\\u7f2b\\u7f2c\\u7f2d\\u7f2e\\u7f2f\\u7f30\\u7f31\\u7f32\\u7f33\\u7f34\\u7f35\\u7f36\\u7f37\\u7f38\\u7f39\\u7f3a\\u7f3b\\u7f3c\\u7f3d\\u7f3e\\u7f3f\\u7f40\\u7f41\\u7f42\\u7f43\\u7f44\\u7f45\\u7f46\\u7f47\\u7f48\\u7f49\\u7f4a\\u7f4b\\u7f4c\\u7f4d\\u7f4e\\u7f4f\\u7f50\\u7f51\\u7f52\\u7f53\\u7f54\\u7f55\\u7f56\\u7f57\\u7f58\\u7f59\\u7f5a\\u7f5b\\u7f5c\\u7f5d\\u7f5e\\u7f5f\\u7f60\\u7f61\\u7f62\\u7f63\\u7f64\\u7f65\\u7f66\\u7f67\\u7f68\\u7f69\\u7f6a\\u7f6b\\u7f6c\\u7f6d\\u7f6e\\u7f6f\\u7f70\\u7f71\\u7f72\\u7f73\\u7f74\\u7f75\\u7f76\\u7f77\\u7f78\\u7f79\\u7f7a\\u7f7b\\u7f7c\\u7f7d\\u7f7e\\u7f7f\\u7f80\\u7f81\\u7f82\\u7f83\\u7f84\\u7f85\\u7f86\\u7f87\\u7f88\\u7f89\\u7f8a\\u7f8b\\u7f8c\\u7f8d\\u7f8e\\u7f8f\\u7f90\\u7f91\\u7f92\\u7f93\\u7f94\\u7f95\\u7f96\\u7f97\\u7f98\\u7f99\\u7f9a\\u7f9b\\u7f9c\\u7f9d\\u7f9e\\u7f9f\\u7fa0\\u7fa1\\u7fa2\\u7fa3\\u7fa4\\u7fa5\\u7fa6\\u7fa7\\u7fa8\\u7fa9\\u7faa\\u7fab\\u7fac\\u7fad\\u7fae\\u7faf\\u7fb0\\u7fb1\\u7fb2\\u7fb3\\u7fb4\\u7fb5\\u7fb6\\u7fb7\\u7fb8\\u7fb9\\u7fba\\u7fbb\\u7fbc\\u7fbd\\u7fbe\\u7fbf\\u7fc0\\u7fc1\\u7fc2\\u7fc3\\u7fc4\\u7fc5\\u7fc6\\u7fc7\\u7fc8\\u7fc9\\u7fca\\u7fcb\\u7fcc\\u7fcd\\u7fce\\u7fcf\\u7fd0\\u7fd1\\u7fd2\\u7fd3\\u7fd4\\u7fd5\\u7fd6\\u7fd7\\u7fd8\\u7fd9\\u7fda\\u7fdb\\u7fdc\\u7fdd\\u7fde\\u7fdf\\u7fe0\\u7fe1\\u7fe2\\u7fe3\\u7fe4\\u7fe5\\u7fe6\\u7fe7\\u7fe8\\u7fe9\\u7fea\\u7feb\\u7fec\\u7fed\\u7fee\\u7fef\\u7ff0\\u7ff1\\u7ff2\\u7ff3\\u7ff4\\u7ff5\\u7ff6\\u7ff7\\u7ff8\\u7ff9\\u7ffa\\u7ffb\\u7ffc\\u7ffd\\u7ffe\\u7fff\\u8000\\u8001\\u8002\\u8003\\u8004\\u8005\\u8006\\u8007\\u8008\\u8009\\u800a\\u800b\\u800c\\u800d\\u800e\\u800f\\u8010\\u8011\\u8012\\u8013\\u8014\\u8015\\u8016\\u8017\\u8018\\u8019\\u801a\\u801b\\u801c\\u801d\\u801e\\u801f\\u8020\\u8021\\u8022\\u8023\\u8024\\u8025\\u8026\\u8027\\u8028\\u8029\\u802a\\u802b\\u802c\\u802d\\u802e\\u802f\\u8030\\u8031\\u8032\\u8033\\u8034\\u8035\\u8036\\u8037\\u8038\\u8039\\u803a\\u803b\\u803c\\u803d\\u803e\\u803f\\u8040\\u8041\\u8042\\u8043\\u8044\\u8045\\u8046\\u8047\\u8048\\u8049\\u804a\\u804b\\u804c\\u804d\\u804e\\u804f\\u8050\\u8051\\u8052\\u8053\\u8054\\u8055\\u8056\\u8057\\u8058\\u8059\\u805a\\u805b\\u805c\\u805d\\u805e\\u805f\\u8060\\u8061\\u8062\\u8063\\u8064\\u8065\\u8066\\u8067\\u8068\\u8069\\u806a\\u806b\\u806c\\u806d\\u806e\\u806f\\u8070\\u8071\\u8072\\u8073\\u8074\\u8075\\u8076\\u8077\\u8078\\u8079\\u807a\\u807b\\u807c\\u807d\\u807e\\u807f\\u8080\\u8081\\u8082\\u8083\\u8084\\u8085\\u8086\\u8087\\u8088\\u8089\\u808a\\u808b\\u808c\\u808d\\u808e\\u808f\\u8090\\u8091\\u8092\\u8093\\u8094\\u8095\\u8096\\u8097\\u8098\\u8099\\u809a\\u809b\\u809c\\u809d\\u809e\\u809f\\u80a0\\u80a1\\u80a2\\u80a3\\u80a4\\u80a5\\u80a6\\u80a7\\u80a8\\u80a9\\u80aa\\u80ab\\u80ac\\u80ad\\u80ae\\u80af\\u80b0\\u80b1\\u80b2\\u80b3\\u80b4\\u80b5\\u80b6\\u80b7\\u80b8\\u80b9\\u80ba\\u80bb\\u80bc\\u80bd\\u80be\\u80bf\\u80c0\\u80c1\\u80c2\\u80c3\\u80c4\\u80c5\\u80c6\\u80c7\\u80c8\\u80c9\\u80ca\\u80cb\\u80cc\\u80cd\\u80ce\\u80cf\\u80d0\\u80d1\\u80d2\\u80d3\\u80d4\\u80d5\\u80d6\\u80d7\\u80d8\\u80d9\\u80da\\u80db\\u80dc\\u80dd\\u80de\\u80df\\u80e0\\u80e1\\u80e2\\u80e3\\u80e4\\u80e5\\u80e6\\u80e7\\u80e8\\u80e9\\u80ea\\u80eb\\u80ec\\u80ed\\u80ee\\u80ef\\u80f0\\u80f1\\u80f2\\u80f3\\u80f4\\u80f5\\u80f6\\u80f7\\u80f8\\u80f9\\u80fa\\u80fb\\u80fc\\u80fd\\u80fe\\u80ff\\u8100\\u8101\\u8102\\u8103\\u8104\\u8105\\u8106\\u8107\\u8108\\u8109\\u810a\\u810b\\u810c\\u810d\\u810e\\u810f\\u8110\\u8111\\u8112\\u8113\\u8114\\u8115\\u8116\\u8117\\u8118\\u8119\\u811a\\u811b\\u811c\\u811d\\u811e\\u811f\\u8120\\u8121\\u8122\\u8123\\u8124\\u8125\\u8126\\u8127\\u8128\\u8129\\u812a\\u812b\\u812c\\u812d\\u812e\\u812f\\u8130\\u8131\\u8132\\u8133\\u8134\\u8135\\u8136\\u8137\\u8138\\u8139\\u813a\\u813b\\u813c\\u813d\\u813e\\u813f\\u8140\\u8141\\u8142\\u8143\\u8144\\u8145\\u8146\\u8147\\u8148\\u8149\\u814a\\u814b\\u814c\\u814d\\u814e\\u814f\\u8150\\u8151\\u8152\\u8153\\u8154\\u8155\\u8156\\u8157\\u8158\\u8159\\u815a\\u815b\\u815c\\u815d\\u815e\\u815f\\u8160\\u8161\\u8162\\u8163\\u8164\\u8165\\u8166\\u8167\\u8168\\u8169\\u816a\\u816b\\u816c\\u816d\\u816e\\u816f\\u8170\\u8171\\u8172\\u8173\\u8174\\u8175\\u8176\\u8177\\u8178\\u8179\\u817a\\u817b\\u817c\\u817d\\u817e\\u817f\\u8180\\u8181\\u8182\\u8183\\u8184\\u8185\\u8186\\u8187\\u8188\\u8189\\u818a\\u818b\\u818c\\u818d\\u818e\\u818f\\u8190\\u8191\\u8192\\u8193\\u8194\\u8195\\u8196\\u8197\\u8198\\u8199\\u819a\\u819b\\u819c\\u819d\\u819e\\u819f\\u81a0\\u81a1\\u81a2\\u81a3\\u81a4\\u81a5\\u81a6\\u81a7\\u81a8\\u81a9\\u81aa\\u81ab\\u81ac\\u81ad\\u81ae\\u81af\\u81b0\\u81b1\\u81b2\\u81b3\\u81b4\\u81b5\\u81b6\\u81b7\\u81b8\\u81b9\\u81ba\\u81bb\\u81bc\\u81bd\\u81be\\u81bf\\u81c0\\u81c1\\u81c2\\u81c3\\u81c4\\u81c5\\u81c6\\u81c7\\u81c8\\u81c9\\u81ca\\u81cb\\u81cc\\u81cd\\u81ce\\u81cf\\u81d0\\u81d1\\u81d2\\u81d3\\u81d4\\u81d5\\u81d6\\u81d7\\u81d8\\u81d9\\u81da\\u81db\\u81dc\\u81dd\\u81de\\u81df\\u81e0\\u81e1\\u81e2\\u81e3\\u81e4\\u81e5\\u81e6\\u81e7\\u81e8\\u81e9\\u81ea\\u81eb\\u81ec\\u81ed\\u81ee\\u81ef\\u81f0\\u81f1\\u81f2\\u81f3\\u81f4\\u81f5\\u81f6\\u81f7\\u81f8\\u81f9\\u81fa\\u81fb\\u81fc\\u81fd\\u81fe\\u81ff\\u8200\\u8201\\u8202\\u8203\\u8204\\u8205\\u8206\\u8207\\u8208\\u8209\\u820a\\u820b\\u820c\\u820d\\u820e\\u820f\\u8210\\u8211\\u8212\\u8213\\u8214\\u8215\\u8216\\u8217\\u8218\\u8219\\u821a\\u821b\\u821c\\u821d\\u821e\\u821f\\u8220\\u8221\\u8222\\u8223\\u8224\\u8225\\u8226\\u8227\\u8228\\u8229\\u822a\\u822b\\u822c\\u822d\\u822e\\u822f\\u8230\\u8231\\u8232\\u8233\\u8234\\u8235\\u8236\\u8237\\u8238\\u8239\\u823a\\u823b\\u823c\\u823d\\u823e\\u823f\\u8240\\u8241\\u8242\\u8243\\u8244\\u8245\\u8246\\u8247\\u8248\\u8249\\u824a\\u824b\\u824c\\u824d\\u824e\\u824f\\u8250\\u8251\\u8252\\u8253\\u8254\\u8255\\u8256\\u8257\\u8258\\u8259\\u825a\\u825b\\u825c\\u825d\\u825e\\u825f\\u8260\\u8261\\u8262\\u8263\\u8264\\u8265\\u8266\\u8267\\u8268\\u8269\\u826a\\u826b\\u826c\\u826d\\u826e\\u826f\\u8270\\u8271\\u8272\\u8273\\u8274\\u8275\\u8276\\u8277\\u8278\\u8279\\u827a\\u827b\\u827c\\u827d\\u827e\\u827f\\u8280\\u8281\\u8282\\u8283\\u8284\\u8285\\u8286\\u8287\\u8288\\u8289\\u828a\\u828b\\u828c\\u828d\\u828e\\u828f\\u8290\\u8291\\u8292\\u8293\\u8294\\u8295\\u8296\\u8297\\u8298\\u8299\\u829a\\u829b\\u829c\\u829d\\u829e\\u829f\\u82a0\\u82a1\\u82a2\\u82a3\\u82a4\\u82a5\\u82a6\\u82a7\\u82a8\\u82a9\\u82aa\\u82ab\\u82ac\\u82ad\\u82ae\\u82af\\u82b0\\u82b1\\u82b2\\u82b3\\u82b4\\u82b5\\u82b6\\u82b7\\u82b8\\u82b9\\u82ba\\u82bb\\u82bc\\u82bd\\u82be\\u82bf\\u82c0\\u82c1\\u82c2\\u82c3\\u82c4\\u82c5\\u82c6\\u82c7\\u82c8\\u82c9\\u82ca\\u82cb\\u82cc\\u82cd\\u82ce\\u82cf\\u82d0\\u82d1\\u82d2\\u82d3\\u82d4\\u82d5\\u82d6\\u82d7\\u82d8\\u82d9\\u82da\\u82db\\u82dc\\u82dd\\u82de\\u82df\\u82e0\\u82e1\\u82e2\\u82e3\\u82e4\\u82e5\\u82e6\\u82e7\\u82e8\\u82e9\\u82ea\\u82eb\\u82ec\\u82ed\\u82ee\\u82ef\\u82f0\\u82f1\\u82f2\\u82f3\\u82f4\\u82f5\\u82f6\\u82f7\\u82f8\\u82f9\\u82fa\\u82fb\\u82fc\\u82fd\\u82fe\\u82ff\\u8300\\u8301\\u8302\\u8303\\u8304\\u8305\\u8306\\u8307\\u8308\\u8309\\u830a\\u830b\\u830c\\u830d\\u830e\\u830f\\u8310\\u8311\\u8312\\u8313\\u8314\\u8315\\u8316\\u8317\\u8318\\u8319\\u831a\\u831b\\u831c\\u831d\\u831e\\u831f\\u8320\\u8321\\u8322\\u8323\\u8324\\u8325\\u8326\\u8327\\u8328\\u8329\\u832a\\u832b\\u832c\\u832d\\u832e\\u832f\\u8330\\u8331\\u8332\\u8333\\u8334\\u8335\\u8336\\u8337\\u8338\\u8339\\u833a\\u833b\\u833c\\u833d\\u833e\\u833f\\u8340\\u8341\\u8342\\u8343\\u8344\\u8345\\u8346\\u8347\\u8348\\u8349\\u834a\\u834b\\u834c\\u834d\\u834e\\u834f\\u8350\\u8351\\u8352\\u8353\\u8354\\u8355\\u8356\\u8357\\u8358\\u8359\\u835a\\u835b\\u835c\\u835d\\u835e\\u835f\\u8360\\u8361\\u8362\\u8363\\u8364\\u8365\\u8366\\u8367\\u8368\\u8369\\u836a\\u836b\\u836c\\u836d\\u836e\\u836f\\u8370\\u8371\\u8372\\u8373\\u8374\\u8375\\u8376\\u8377\\u8378\\u8379\\u837a\\u837b\\u837c\\u837d\\u837e\\u837f\\u8380\\u8381\\u8382\\u8383\\u8384\\u8385\\u8386\\u8387\\u8388\\u8389\\u838a\\u838b\\u838c\\u838d\\u838e\\u838f\\u8390\\u8391\\u8392\\u8393\\u8394\\u8395\\u8396\\u8397\\u8398\\u8399\\u839a\\u839b\\u839c\\u839d\\u839e\\u839f\\u83a0\\u83a1\\u83a2\\u83a3\\u83a4\\u83a5\\u83a6\\u83a7\\u83a8\\u83a9\\u83aa\\u83ab\\u83ac\\u83ad\\u83ae\\u83af\\u83b0\\u83b1\\u83b2\\u83b3\\u83b4\\u83b5\\u83b6\\u83b7\\u83b8\\u83b9\\u83ba\\u83bb\\u83bc\\u83bd\\u83be\\u83bf\\u83c0\\u83c1\\u83c2\\u83c3\\u83c4\\u83c5\\u83c6\\u83c7\\u83c8\\u83c9\\u83ca\\u83cb\\u83cc\\u83cd\\u83ce\\u83cf\\u83d0\\u83d1\\u83d2\\u83d3\\u83d4\\u83d5\\u83d6\\u83d7\\u83d8\\u83d9\\u83da\\u83db\\u83dc\\u83dd\\u83de\\u83df\\u83e0\\u83e1\\u83e2\\u83e3\\u83e4\\u83e5\\u83e6\\u83e7\\u83e8\\u83e9\\u83ea\\u83eb\\u83ec\\u83ed\\u83ee\\u83ef\\u83f0\\u83f1\\u83f2\\u83f3\\u83f4\\u83f5\\u83f6\\u83f7\\u83f8\\u83f9\\u83fa\\u83fb\\u83fc\\u83fd\\u83fe\\u83ff\\u8400\\u8401\\u8402\\u8403\\u8404\\u8405\\u8406\\u8407\\u8408\\u8409\\u840a\\u840b\\u840c\\u840d\\u840e\\u840f\\u8410\\u8411\\u8412\\u8413\\u8414\\u8415\\u8416\\u8417\\u8418\\u8419\\u841a\\u841b\\u841c\\u841d\\u841e\\u841f\\u8420\\u8421\\u8422\\u8423\\u8424\\u8425\\u8426\\u8427\\u8428\\u8429\\u842a\\u842b\\u842c\\u842d\\u842e\\u842f\\u8430\\u8431\\u8432\\u8433\\u8434\\u8435\\u8436\\u8437\\u8438\\u8439\\u843a\\u843b\\u843c\\u843d\\u843e\\u843f\\u8440\\u8441\\u8442\\u8443\\u8444\\u8445\\u8446\\u8447\\u8448\\u8449\\u844a\\u844b\\u844c\\u844d\\u844e\\u844f\\u8450\\u8451\\u8452\\u8453\\u8454\\u8455\\u8456\\u8457\\u8458\\u8459\\u845a\\u845b\\u845c\\u845d\\u845e\\u845f\\u8460\\u8461\\u8462\\u8463\\u8464\\u8465\\u8466\\u8467\\u8468\\u8469\\u846a\\u846b\\u846c\\u846d\\u846e\\u846f\\u8470\\u8471\\u8472\\u8473\\u8474\\u8475\\u8476\\u8477\\u8478\\u8479\\u847a\\u847b\\u847c\\u847d\\u847e\\u847f\\u8480\\u8481\\u8482\\u8483\\u8484\\u8485\\u8486\\u8487\\u8488\\u8489\\u848a\\u848b\\u848c\\u848d\\u848e\\u848f\\u8490\\u8491\\u8492\\u8493\\u8494\\u8495\\u8496\\u8497\\u8498\\u8499\\u849a\\u849b\\u849c\\u849d\\u849e\\u849f\\u84a0\\u84a1\\u84a2\\u84a3\\u84a4\\u84a5\\u84a6\\u84a7\\u84a8\\u84a9\\u84aa\\u84ab\\u84ac\\u84ad\\u84ae\\u84af\\u84b0\\u84b1\\u84b2\\u84b3\\u84b4\\u84b5\\u84b6\\u84b7\\u84b8\\u84b9\\u84ba\\u84bb\\u84bc\\u84bd\\u84be\\u84bf\\u84c0\\u84c1\\u84c2\\u84c3\\u84c4\\u84c5\\u84c6\\u84c7\\u84c8\\u84c9\\u84ca\\u84cb\\u84cc\\u84cd\\u84ce\\u84cf\\u84d0\\u84d1\\u84d2\\u84d3\\u84d4\\u84d5\\u84d6\\u84d7\\u84d8\\u84d9\\u84da\\u84db\\u84dc\\u84dd\\u84de\\u84df\\u84e0\\u84e1\\u84e2\\u84e3\\u84e4\\u84e5\\u84e6\\u84e7\\u84e8\\u84e9\\u84ea\\u84eb\\u84ec\\u84ed\\u84ee\\u84ef\\u84f0\\u84f1\\u84f2\\u84f3\\u84f4\\u84f5\\u84f6\\u84f7\\u84f8\\u84f9\\u84fa\\u84fb\\u84fc\\u84fd\\u84fe\\u84ff\\u8500\\u8501\\u8502\\u8503\\u8504\\u8505\\u8506\\u8507\\u8508\\u8509\\u850a\\u850b\\u850c\\u850d\\u850e\\u850f\\u8510\\u8511\\u8512\\u8513\\u8514\\u8515\\u8516\\u8517\\u8518\\u8519\\u851a\\u851b\\u851c\\u851d\\u851e\\u851f\\u8520\\u8521\\u8522\\u8523\\u8524\\u8525\\u8526\\u8527\\u8528\\u8529\\u852a\\u852b\\u852c\\u852d\\u852e\\u852f\\u8530\\u8531\\u8532\\u8533\\u8534\\u8535\\u8536\\u8537\\u8538\\u8539\\u853a\\u853b\\u853c\\u853d\\u853e\\u853f\\u8540\\u8541\\u8542\\u8543\\u8544\\u8545\\u8546\\u8547\\u8548\\u8549\\u854a\\u854b\\u854c\\u854d\\u854e\\u854f\\u8550\\u8551\\u8552\\u8553\\u8554\\u8555\\u8556\\u8557\\u8558\\u8559\\u855a\\u855b\\u855c\\u855d\\u855e\\u855f\\u8560\\u8561\\u8562\\u8563\\u8564\\u8565\\u8566\\u8567\\u8568\\u8569\\u856a\\u856b\\u856c\\u856d\\u856e\\u856f\\u8570\\u8571\\u8572\\u8573\\u8574\\u8575\\u8576\\u8577\\u8578\\u8579\\u857a\\u857b\\u857c\\u857d\\u857e\\u857f\\u8580\\u8581\\u8582\\u8583\\u8584\\u8585\\u8586\\u8587\\u8588\\u8589\\u858a\\u858b\\u858c\\u858d\\u858e\\u858f\\u8590\\u8591\\u8592\\u8593\\u8594\\u8595\\u8596\\u8597\\u8598\\u8599\\u859a\\u859b\\u859c\\u859d\\u859e\\u859f\\u85a0\\u85a1\\u85a2\\u85a3\\u85a4\\u85a5\\u85a6\\u85a7\\u85a8\\u85a9\\u85aa\\u85ab\\u85ac\\u85ad\\u85ae\\u85af\\u85b0\\u85b1\\u85b2\\u85b3\\u85b4\\u85b5\\u85b6\\u85b7\\u85b8\\u85b9\\u85ba\\u85bb\\u85bc\\u85bd\\u85be\\u85bf\\u85c0\\u85c1\\u85c2\\u85c3\\u85c4\\u85c5\\u85c6\\u85c7\\u85c8\\u85c9\\u85ca\\u85cb\\u85cc\\u85cd\\u85ce\\u85cf\\u85d0\\u85d1\\u85d2\\u85d3\\u85d4\\u85d5\\u85d6\\u85d7\\u85d8\\u85d9\\u85da\\u85db\\u85dc\\u85dd\\u85de\\u85df\\u85e0\\u85e1\\u85e2\\u85e3\\u85e4\\u85e5\\u85e6\\u85e7\\u85e8\\u85e9\\u85ea\\u85eb\\u85ec\\u85ed\\u85ee\\u85ef\\u85f0\\u85f1\\u85f2\\u85f3\\u85f4\\u85f5\\u85f6\\u85f7\\u85f8\\u85f9\\u85fa\\u85fb\\u85fc\\u85fd\\u85fe\\u85ff\\u8600\\u8601\\u8602\\u8603\\u8604\\u8605\\u8606\\u8607\\u8608\\u8609\\u860a\\u860b\\u860c\\u860d\\u860e\\u860f\\u8610\\u8611\\u8612\\u8613\\u8614\\u8615\\u8616\\u8617\\u8618\\u8619\\u861a\\u861b\\u861c\\u861d\\u861e\\u861f\\u8620\\u8621\\u8622\\u8623\\u8624\\u8625\\u8626\\u8627\\u8628\\u8629\\u862a\\u862b\\u862c\\u862d\\u862e\\u862f\\u8630\\u8631\\u8632\\u8633\\u8634\\u8635\\u8636\\u8637\\u8638\\u8639\\u863a\\u863b\\u863c\\u863d\\u863e\\u863f\\u8640\\u8641\\u8642\\u8643\\u8644\\u8645\\u8646\\u8647\\u8648\\u8649\\u864a\\u864b\\u864c\\u864d\\u864e\\u864f\\u8650\\u8651\\u8652\\u8653\\u8654\\u8655\\u8656\\u8657\\u8658\\u8659\\u865a\\u865b\\u865c\\u865d\\u865e\\u865f\\u8660\\u8661\\u8662\\u8663\\u8664\\u8665\\u8666\\u8667\\u8668\\u8669\\u866a\\u866b\\u866c\\u866d\\u866e\\u866f\\u8670\\u8671\\u8672\\u8673\\u8674\\u8675\\u8676\\u8677\\u8678\\u8679\\u867a\\u867b\\u867c\\u867d\\u867e\\u867f\\u8680\\u8681\\u8682\\u8683\\u8684\\u8685\\u8686\\u8687\\u8688\\u8689\\u868a\\u868b\\u868c\\u868d\\u868e\\u868f\\u8690\\u8691\\u8692\\u8693\\u8694\\u8695\\u8696\\u8697\\u8698\\u8699\\u869a\\u869b\\u869c\\u869d\\u869e\\u869f\\u86a0\\u86a1\\u86a2\\u86a3\\u86a4\\u86a5\\u86a6\\u86a7\\u86a8\\u86a9\\u86aa\\u86ab\\u86ac\\u86ad\\u86ae\\u86af\\u86b0\\u86b1\\u86b2\\u86b3\\u86b4\\u86b5\\u86b6\\u86b7\\u86b8\\u86b9\\u86ba\\u86bb\\u86bc\\u86bd\\u86be\\u86bf\\u86c0\\u86c1\\u86c2\\u86c3\\u86c4\\u86c5\\u86c6\\u86c7\\u86c8\\u86c9\\u86ca\\u86cb\\u86cc\\u86cd\\u86ce\\u86cf\\u86d0\\u86d1\\u86d2\\u86d3\\u86d4\\u86d5\\u86d6\\u86d7\\u86d8\\u86d9\\u86da\\u86db\\u86dc\\u86dd\\u86de\\u86df\\u86e0\\u86e1\\u86e2\\u86e3\\u86e4\\u86e5\\u86e6\\u86e7\\u86e8\\u86e9\\u86ea\\u86eb\\u86ec\\u86ed\\u86ee\\u86ef\\u86f0\\u86f1\\u86f2\\u86f3\\u86f4\\u86f5\\u86f6\\u86f7\\u86f8\\u86f9\\u86fa\\u86fb\\u86fc\\u86fd\\u86fe\\u86ff\\u8700\\u8701\\u8702\\u8703\\u8704\\u8705\\u8706\\u8707\\u8708\\u8709\\u870a\\u870b\\u870c\\u870d\\u870e\\u870f\\u8710\\u8711\\u8712\\u8713\\u8714\\u8715\\u8716\\u8717\\u8718\\u8719\\u871a\\u871b\\u871c\\u871d\\u871e\\u871f\\u8720\\u8721\\u8722\\u8723\\u8724\\u8725\\u8726\\u8727\\u8728\\u8729\\u872a\\u872b\\u872c\\u872d\\u872e\\u872f\\u8730\\u8731\\u8732\\u8733\\u8734\\u8735\\u8736\\u8737\\u8738\\u8739\\u873a\\u873b\\u873c\\u873d\\u873e\\u873f\\u8740\\u8741\\u8742\\u8743\\u8744\\u8745\\u8746\\u8747\\u8748\\u8749\\u874a\\u874b\\u874c\\u874d\\u874e\\u874f\\u8750\\u8751\\u8752\\u8753\\u8754\\u8755\\u8756\\u8757\\u8758\\u8759\\u875a\\u875b\\u875c\\u875d\\u875e\\u875f\\u8760\\u8761\\u8762\\u8763\\u8764\\u8765\\u8766\\u8767\\u8768\\u8769\\u876a\\u876b\\u876c\\u876d\\u876e\\u876f\\u8770\\u8771\\u8772\\u8773\\u8774\\u8775\\u8776\\u8777\\u8778\\u8779\\u877a\\u877b\\u877c\\u877d\\u877e\\u877f\\u8780\\u8781\\u8782\\u8783\\u8784\\u8785\\u8786\\u8787\\u8788\\u8789\\u878a\\u878b\\u878c\\u878d\\u878e\\u878f\\u8790\\u8791\\u8792\\u8793\\u8794\\u8795\\u8796\\u8797\\u8798\\u8799\\u879a\\u879b\\u879c\\u879d\\u879e\\u879f\\u87a0\\u87a1\\u87a2\\u87a3\\u87a4\\u87a5\\u87a6\\u87a7\\u87a8\\u87a9\\u87aa\\u87ab\\u87ac\\u87ad\\u87ae\\u87af\\u87b0\\u87b1\\u87b2\\u87b3\\u87b4\\u87b5\\u87b6\\u87b7\\u87b8\\u87b9\\u87ba\\u87bb\\u87bc\\u87bd\\u87be\\u87bf\\u87c0\\u87c1\\u87c2\\u87c3\\u87c4\\u87c5\\u87c6\\u87c7\\u87c8\\u87c9\\u87ca\\u87cb\\u87cc\\u87cd\\u87ce\\u87cf\\u87d0\\u87d1\\u87d2\\u87d3\\u87d4\\u87d5\\u87d6\\u87d7\\u87d8\\u87d9\\u87da\\u87db\\u87dc\\u87dd\\u87de\\u87df\\u87e0\\u87e1\\u87e2\\u87e3\\u87e4\\u87e5\\u87e6\\u87e7\\u87e8\\u87e9\\u87ea\\u87eb\\u87ec\\u87ed\\u87ee\\u87ef\\u87f0\\u87f1\\u87f2\\u87f3\\u87f4\\u87f5\\u87f6\\u87f7\\u87f8\\u87f9\\u87fa\\u87fb\\u87fc\\u87fd\\u87fe\\u87ff\\u8800\\u8801\\u8802\\u8803\\u8804\\u8805\\u8806\\u8807\\u8808\\u8809\\u880a\\u880b\\u880c\\u880d\\u880e\\u880f\\u8810\\u8811\\u8812\\u8813\\u8814\\u8815\\u8816\\u8817\\u8818\\u8819\\u881a\\u881b\\u881c\\u881d\\u881e\\u881f\\u8820\\u8821\\u8822\\u8823\\u8824\\u8825\\u8826\\u8827\\u8828\\u8829\\u882a\\u882b\\u882c\\u882d\\u882e\\u882f\\u8830\\u8831\\u8832\\u8833\\u8834\\u8835\\u8836\\u8837\\u8838\\u8839\\u883a\\u883b\\u883c\\u883d\\u883e\\u883f\\u8840\\u8841\\u8842\\u8843\\u8844\\u8845\\u8846\\u8847\\u8848\\u8849\\u884a\\u884b\\u884c\\u884d\\u884e\\u884f\\u8850\\u8851\\u8852\\u8853\\u8854\\u8855\\u8856\\u8857\\u8858\\u8859\\u885a\\u885b\\u885c\\u885d\\u885e\\u885f\\u8860\\u8861\\u8862\\u8863\\u8864\\u8865\\u8866\\u8867\\u8868\\u8869\\u886a\\u886b\\u886c\\u886d\\u886e\\u886f\\u8870\\u8871\\u8872\\u8873\\u8874\\u8875\\u8876\\u8877\\u8878\\u8879\\u887a\\u887b\\u887c\\u887d\\u887e\\u887f\\u8880\\u8881\\u8882\\u8883\\u8884\\u8885\\u8886\\u8887\\u8888\\u8889\\u888a\\u888b\\u888c\\u888d\\u888e\\u888f\\u8890\\u8891\\u8892\\u8893\\u8894\\u8895\\u8896\\u8897\\u8898\\u8899\\u889a\\u889b\\u889c\\u889d\\u889e\\u889f\\u88a0\\u88a1\\u88a2\\u88a3\\u88a4\\u88a5\\u88a6\\u88a7\\u88a8\\u88a9\\u88aa\\u88ab\\u88ac\\u88ad\\u88ae\\u88af\\u88b0\\u88b1\\u88b2\\u88b3\\u88b4\\u88b5\\u88b6\\u88b7\\u88b8\\u88b9\\u88ba\\u88bb\\u88bc\\u88bd\\u88be\\u88bf\\u88c0\\u88c1\\u88c2\\u88c3\\u88c4\\u88c5\\u88c6\\u88c7\\u88c8\\u88c9\\u88ca\\u88cb\\u88cc\\u88cd\\u88ce\\u88cf\\u88d0\\u88d1\\u88d2\\u88d3\\u88d4\\u88d5\\u88d6\\u88d7\\u88d8\\u88d9\\u88da\\u88db\\u88dc\\u88dd\\u88de\\u88df\\u88e0\\u88e1\\u88e2\\u88e3\\u88e4\\u88e5\\u88e6\\u88e7\\u88e8\\u88e9\\u88ea\\u88eb\\u88ec\\u88ed\\u88ee\\u88ef\\u88f0\\u88f1\\u88f2\\u88f3\\u88f4\\u88f5\\u88f6\\u88f7\\u88f8\\u88f9\\u88fa\\u88fb\\u88fc\\u88fd\\u88fe\\u88ff\\u8900\\u8901\\u8902\\u8903\\u8904\\u8905\\u8906\\u8907\\u8908\\u8909\\u890a\\u890b\\u890c\\u890d\\u890e\\u890f\\u8910\\u8911\\u8912\\u8913\\u8914\\u8915\\u8916\\u8917\\u8918\\u8919\\u891a\\u891b\\u891c\\u891d\\u891e\\u891f\\u8920\\u8921\\u8922\\u8923\\u8924\\u8925\\u8926\\u8927\\u8928\\u8929\\u892a\\u892b\\u892c\\u892d\\u892e\\u892f\\u8930\\u8931\\u8932\\u8933\\u8934\\u8935\\u8936\\u8937\\u8938\\u8939\\u893a\\u893b\\u893c\\u893d\\u893e\\u893f\\u8940\\u8941\\u8942\\u8943\\u8944\\u8945\\u8946\\u8947\\u8948\\u8949\\u894a\\u894b\\u894c\\u894d\\u894e\\u894f\\u8950\\u8951\\u8952\\u8953\\u8954\\u8955\\u8956\\u8957\\u8958\\u8959\\u895a\\u895b\\u895c\\u895d\\u895e\\u895f\\u8960\\u8961\\u8962\\u8963\\u8964\\u8965\\u8966\\u8967\\u8968\\u8969\\u896a\\u896b\\u896c\\u896d\\u896e\\u896f\\u8970\\u8971\\u8972\\u8973\\u8974\\u8975\\u8976\\u8977\\u8978\\u8979\\u897a\\u897b\\u897c\\u897d\\u897e\\u897f\\u8980\\u8981\\u8982\\u8983\\u8984\\u8985\\u8986\\u8987\\u8988\\u8989\\u898a\\u898b\\u898c\\u898d\\u898e\\u898f\\u8990\\u8991\\u8992\\u8993\\u8994\\u8995\\u8996\\u8997\\u8998\\u8999\\u899a\\u899b\\u899c\\u899d\\u899e\\u899f\\u89a0\\u89a1\\u89a2\\u89a3\\u89a4\\u89a5\\u89a6\\u89a7\\u89a8\\u89a9\\u89aa\\u89ab\\u89ac\\u89ad\\u89ae\\u89af\\u89b0\\u89b1\\u89b2\\u89b3\\u89b4\\u89b5\\u89b6\\u89b7\\u89b8\\u89b9\\u89ba\\u89bb\\u89bc\\u89bd\\u89be\\u89bf\\u89c0\\u89c1\\u89c2\\u89c3\\u89c4\\u89c5\\u89c6\\u89c7\\u89c8\\u89c9\\u89ca\\u89cb\\u89cc\\u89cd\\u89ce\\u89cf\\u89d0\\u89d1\\u89d2\\u89d3\\u89d4\\u89d5\\u89d6\\u89d7\\u89d8\\u89d9\\u89da\\u89db\\u89dc\\u89dd\\u89de\\u89df\\u89e0\\u89e1\\u89e2\\u89e3\\u89e4\\u89e5\\u89e6\\u89e7\\u89e8\\u89e9\\u89ea\\u89eb\\u89ec\\u89ed\\u89ee\\u89ef\\u89f0\\u89f1\\u89f2\\u89f3\\u89f4\\u89f5\\u89f6\\u89f7\\u89f8\\u89f9\\u89fa\\u89fb\\u89fc\\u89fd\\u89fe\\u89ff\\u8a00\\u8a01\\u8a02\\u8a03\\u8a04\\u8a05\\u8a06\\u8a07\\u8a08\\u8a09\\u8a0a\\u8a0b\\u8a0c\\u8a0d\\u8a0e\\u8a0f\\u8a10\\u8a11\\u8a12\\u8a13\\u8a14\\u8a15\\u8a16\\u8a17\\u8a18\\u8a19\\u8a1a\\u8a1b\\u8a1c\\u8a1d\\u8a1e\\u8a1f\\u8a20\\u8a21\\u8a22\\u8a23\\u8a24\\u8a25\\u8a26\\u8a27\\u8a28\\u8a29\\u8a2a\\u8a2b\\u8a2c\\u8a2d\\u8a2e\\u8a2f\\u8a30\\u8a31\\u8a32\\u8a33\\u8a34\\u8a35\\u8a36\\u8a37\\u8a38\\u8a39\\u8a3a\\u8a3b\\u8a3c\\u8a3d\\u8a3e\\u8a3f\\u8a40\\u8a41\\u8a42\\u8a43\\u8a44\\u8a45\\u8a46\\u8a47\\u8a48\\u8a49\\u8a4a\\u8a4b\\u8a4c\\u8a4d\\u8a4e\\u8a4f\\u8a50\\u8a51\\u8a52\\u8a53\\u8a54\\u8a55\\u8a56\\u8a57\\u8a58\\u8a59\\u8a5a\\u8a5b\\u8a5c\\u8a5d\\u8a5e\\u8a5f\\u8a60\\u8a61\\u8a62\\u8a63\\u8a64\\u8a65\\u8a66\\u8a67\\u8a68\\u8a69\\u8a6a\\u8a6b\\u8a6c\\u8a6d\\u8a6e\\u8a6f\\u8a70\\u8a71\\u8a72\\u8a73\\u8a74\\u8a75\\u8a76\\u8a77\\u8a78\\u8a79\\u8a7a\\u8a7b\\u8a7c\\u8a7d\\u8a7e\\u8a7f\\u8a80\\u8a81\\u8a82\\u8a83\\u8a84\\u8a85\\u8a86\\u8a87\\u8a88\\u8a89\\u8a8a\\u8a8b\\u8a8c\\u8a8d\\u8a8e\\u8a8f\\u8a90\\u8a91\\u8a92\\u8a93\\u8a94\\u8a95\\u8a96\\u8a97\\u8a98\\u8a99\\u8a9a\\u8a9b\\u8a9c\\u8a9d\\u8a9e\\u8a9f\\u8aa0\\u8aa1\\u8aa2\\u8aa3\\u8aa4\\u8aa5\\u8aa6\\u8aa7\\u8aa8\\u8aa9\\u8aaa\\u8aab\\u8aac\\u8aad\\u8aae\\u8aaf\\u8ab0\\u8ab1\\u8ab2\\u8ab3\\u8ab4\\u8ab5\\u8ab6\\u8ab7\\u8ab8\\u8ab9\\u8aba\\u8abb\\u8abc\\u8abd\\u8abe\\u8abf\\u8ac0\\u8ac1\\u8ac2\\u8ac3\\u8ac4\\u8ac5\\u8ac6\\u8ac7\\u8ac8\\u8ac9\\u8aca\\u8acb\\u8acc\\u8acd\\u8ace\\u8acf\\u8ad0\\u8ad1\\u8ad2\\u8ad3\\u8ad4\\u8ad5\\u8ad6\\u8ad7\\u8ad8\\u8ad9\\u8ada\\u8adb\\u8adc\\u8add\\u8ade\\u8adf\\u8ae0\\u8ae1\\u8ae2\\u8ae3\\u8ae4\\u8ae5\\u8ae6\\u8ae7\\u8ae8\\u8ae9\\u8aea\\u8aeb\\u8aec\\u8aed\\u8aee\\u8aef\\u8af0\\u8af1\\u8af2\\u8af3\\u8af4\\u8af5\\u8af6\\u8af7\\u8af8\\u8af9\\u8afa\\u8afb\\u8afc\\u8afd\\u8afe\\u8aff\\u8b00\\u8b01\\u8b02\\u8b03\\u8b04\\u8b05\\u8b06\\u8b07\\u8b08\\u8b09\\u8b0a\\u8b0b\\u8b0c\\u8b0d\\u8b0e\\u8b0f\\u8b10\\u8b11\\u8b12\\u8b13\\u8b14\\u8b15\\u8b16\\u8b17\\u8b18\\u8b19\\u8b1a\\u8b1b\\u8b1c\\u8b1d\\u8b1e\\u8b1f\\u8b20\\u8b21\\u8b22\\u8b23\\u8b24\\u8b25\\u8b26\\u8b27\\u8b28\\u8b29\\u8b2a\\u8b2b\\u8b2c\\u8b2d\\u8b2e\\u8b2f\\u8b30\\u8b31\\u8b32\\u8b33\\u8b34\\u8b35\\u8b36\\u8b37\\u8b38\\u8b39\\u8b3a\\u8b3b\\u8b3c\\u8b3d\\u8b3e\\u8b3f\\u8b40\\u8b41\\u8b42\\u8b43\\u8b44\\u8b45\\u8b46\\u8b47\\u8b48\\u8b49\\u8b4a\\u8b4b\\u8b4c\\u8b4d\\u8b4e\\u8b4f\\u8b50\\u8b51\\u8b52\\u8b53\\u8b54\\u8b55\\u8b56\\u8b57\\u8b58\\u8b59\\u8b5a\\u8b5b\\u8b5c\\u8b5d\\u8b5e\\u8b5f\\u8b60\\u8b61\\u8b62\\u8b63\\u8b64\\u8b65\\u8b66\\u8b67\\u8b68\\u8b69\\u8b6a\\u8b6b\\u8b6c\\u8b6d\\u8b6e\\u8b6f\\u8b70\\u8b71\\u8b72\\u8b73\\u8b74\\u8b75\\u8b76\\u8b77\\u8b78\\u8b79\\u8b7a\\u8b7b\\u8b7c\\u8b7d\\u8b7e\\u8b7f\\u8b80\\u8b81\\u8b82\\u8b83\\u8b84\\u8b85\\u8b86\\u8b87\\u8b88\\u8b89\\u8b8a\\u8b8b\\u8b8c\\u8b8d\\u8b8e\\u8b8f\\u8b90\\u8b91\\u8b92\\u8b93\\u8b94\\u8b95\\u8b96\\u8b97\\u8b98\\u8b99\\u8b9a\\u8b9b\\u8b9c\\u8b9d\\u8b9e\\u8b9f\\u8ba0\\u8ba1\\u8ba2\\u8ba3\\u8ba4\\u8ba5\\u8ba6\\u8ba7\\u8ba8\\u8ba9\\u8baa\\u8bab\\u8bac\\u8bad\\u8bae\\u8baf\\u8bb0\\u8bb1\\u8bb2\\u8bb3\\u8bb4\\u8bb5\\u8bb6\\u8bb7\\u8bb8\\u8bb9\\u8bba\\u8bbb\\u8bbc\\u8bbd\\u8bbe\\u8bbf\\u8bc0\\u8bc1\\u8bc2\\u8bc3\\u8bc4\\u8bc5\\u8bc6\\u8bc7\\u8bc8\\u8bc9\\u8bca\\u8bcb\\u8bcc\\u8bcd\\u8bce\\u8bcf\\u8bd0\\u8bd1\\u8bd2\\u8bd3\\u8bd4\\u8bd5\\u8bd6\\u8bd7\\u8bd8\\u8bd9\\u8bda\\u8bdb\\u8bdc\\u8bdd\\u8bde\\u8bdf\\u8be0\\u8be1\\u8be2\\u8be3\\u8be4\\u8be5\\u8be6\\u8be7\\u8be8\\u8be9\\u8bea\\u8beb\\u8bec\\u8bed\\u8bee\\u8bef\\u8bf0\\u8bf1\\u8bf2\\u8bf3\\u8bf4\\u8bf5\\u8bf6\\u8bf7\\u8bf8\\u8bf9\\u8bfa\\u8bfb\\u8bfc\\u8bfd\\u8bfe\\u8bff\\u8c00\\u8c01\\u8c02\\u8c03\\u8c04\\u8c05\\u8c06\\u8c07\\u8c08\\u8c09\\u8c0a\\u8c0b\\u8c0c\\u8c0d\\u8c0e\\u8c0f\\u8c10\\u8c11\\u8c12\\u8c13\\u8c14\\u8c15\\u8c16\\u8c17\\u8c18\\u8c19\\u8c1a\\u8c1b\\u8c1c\\u8c1d\\u8c1e\\u8c1f\\u8c20\\u8c21\\u8c22\\u8c23\\u8c24\\u8c25\\u8c26\\u8c27\\u8c28\\u8c29\\u8c2a\\u8c2b\\u8c2c\\u8c2d\\u8c2e\\u8c2f\\u8c30\\u8c31\\u8c32\\u8c33\\u8c34\\u8c35\\u8c36\\u8c37\\u8c38\\u8c39\\u8c3a\\u8c3b\\u8c3c\\u8c3d\\u8c3e\\u8c3f\\u8c40\\u8c41\\u8c42\\u8c43\\u8c44\\u8c45\\u8c46\\u8c47\\u8c48\\u8c49\\u8c4a\\u8c4b\\u8c4c\\u8c4d\\u8c4e\\u8c4f\\u8c50\\u8c51\\u8c52\\u8c53\\u8c54\\u8c55\\u8c56\\u8c57\\u8c58\\u8c59\\u8c5a\\u8c5b\\u8c5c\\u8c5d\\u8c5e\\u8c5f\\u8c60\\u8c61\\u8c62\\u8c63\\u8c64\\u8c65\\u8c66\\u8c67\\u8c68\\u8c69\\u8c6a\\u8c6b\\u8c6c\\u8c6d\\u8c6e\\u8c6f\\u8c70\\u8c71\\u8c72\\u8c73\\u8c74\\u8c75\\u8c76\\u8c77\\u8c78\\u8c79\\u8c7a\\u8c7b\\u8c7c\\u8c7d\\u8c7e\\u8c7f\\u8c80\\u8c81\\u8c82\\u8c83\\u8c84\\u8c85\\u8c86\\u8c87\\u8c88\\u8c89\\u8c8a\\u8c8b\\u8c8c\\u8c8d\\u8c8e\\u8c8f\\u8c90\\u8c91\\u8c92\\u8c93\\u8c94\\u8c95\\u8c96\\u8c97\\u8c98\\u8c99\\u8c9a\\u8c9b\\u8c9c\\u8c9d\\u8c9e\\u8c9f\\u8ca0\\u8ca1\\u8ca2\\u8ca3\\u8ca4\\u8ca5\\u8ca6\\u8ca7\\u8ca8\\u8ca9\\u8caa\\u8cab\\u8cac\\u8cad\\u8cae\\u8caf\\u8cb0\\u8cb1\\u8cb2\\u8cb3\\u8cb4\\u8cb5\\u8cb6\\u8cb7\\u8cb8\\u8cb9\\u8cba\\u8cbb\\u8cbc\\u8cbd\\u8cbe\\u8cbf\\u8cc0\\u8cc1\\u8cc2\\u8cc3\\u8cc4\\u8cc5\\u8cc6\\u8cc7\\u8cc8\\u8cc9\\u8cca\\u8ccb\\u8ccc\\u8ccd\\u8cce\\u8ccf\\u8cd0\\u8cd1\\u8cd2\\u8cd3\\u8cd4\\u8cd5\\u8cd6\\u8cd7\\u8cd8\\u8cd9\\u8cda\\u8cdb\\u8cdc\\u8cdd\\u8cde\\u8cdf\\u8ce0\\u8ce1\\u8ce2\\u8ce3\\u8ce4\\u8ce5\\u8ce6\\u8ce7\\u8ce8\\u8ce9\\u8cea\\u8ceb\\u8cec\\u8ced\\u8cee\\u8cef\\u8cf0\\u8cf1\\u8cf2\\u8cf3\\u8cf4\\u8cf5\\u8cf6\\u8cf7\\u8cf8\\u8cf9\\u8cfa\\u8cfb\\u8cfc\\u8cfd\\u8cfe\\u8cff\\u8d00\\u8d01\\u8d02\\u8d03\\u8d04\\u8d05\\u8d06\\u8d07\\u8d08\\u8d09\\u8d0a\\u8d0b\\u8d0c\\u8d0d\\u8d0e\\u8d0f\\u8d10\\u8d11\\u8d12\\u8d13\\u8d14\\u8d15\\u8d16\\u8d17\\u8d18\\u8d19\\u8d1a\\u8d1b\\u8d1c\\u8d1d\\u8d1e\\u8d1f\\u8d20\\u8d21\\u8d22\\u8d23\\u8d24\\u8d25\\u8d26\\u8d27\\u8d28\\u8d29\\u8d2a\\u8d2b\\u8d2c\\u8d2d\\u8d2e\\u8d2f\\u8d30\\u8d31\\u8d32\\u8d33\\u8d34\\u8d35\\u8d36\\u8d37\\u8d38\\u8d39\\u8d3a\\u8d3b\\u8d3c\\u8d3d\\u8d3e\\u8d3f\\u8d40\\u8d41\\u8d42\\u8d43\\u8d44\\u8d45\\u8d46\\u8d47\\u8d48\\u8d49\\u8d4a\\u8d4b\\u8d4c\\u8d4d\\u8d4e\\u8d4f\\u8d50\\u8d51\\u8d52\\u8d53\\u8d54\\u8d55\\u8d56\\u8d57\\u8d58\\u8d59\\u8d5a\\u8d5b\\u8d5c\\u8d5d\\u8d5e\\u8d5f\\u8d60\\u8d61\\u8d62\\u8d63\\u8d64\\u8d65\\u8d66\\u8d67\\u8d68\\u8d69\\u8d6a\\u8d6b\\u8d6c\\u8d6d\\u8d6e\\u8d6f\\u8d70\\u8d71\\u8d72\\u8d73\\u8d74\\u8d75\\u8d76\\u8d77\\u8d78\\u8d79\\u8d7a\\u8d7b\\u8d7c\\u8d7d\\u8d7e\\u8d7f\\u8d80\\u8d81\\u8d82\\u8d83\\u8d84\\u8d85\\u8d86\\u8d87\\u8d88\\u8d89\\u8d8a\\u8d8b\\u8d8c\\u8d8d\\u8d8e\\u8d8f\\u8d90\\u8d91\\u8d92\\u8d93\\u8d94\\u8d95\\u8d96\\u8d97\\u8d98\\u8d99\\u8d9a\\u8d9b\\u8d9c\\u8d9d\\u8d9e\\u8d9f\\u8da0\\u8da1\\u8da2\\u8da3\\u8da4\\u8da5\\u8da6\\u8da7\\u8da8\\u8da9\\u8daa\\u8dab\\u8dac\\u8dad\\u8dae\\u8daf\\u8db0\\u8db1\\u8db2\\u8db3\\u8db4\\u8db5\\u8db6\\u8db7\\u8db8\\u8db9\\u8dba\\u8dbb\\u8dbc\\u8dbd\\u8dbe\\u8dbf\\u8dc0\\u8dc1\\u8dc2\\u8dc3\\u8dc4\\u8dc5\\u8dc6\\u8dc7\\u8dc8\\u8dc9\\u8dca\\u8dcb\\u8dcc\\u8dcd\\u8dce\\u8dcf\\u8dd0\\u8dd1\\u8dd2\\u8dd3\\u8dd4\\u8dd5\\u8dd6\\u8dd7\\u8dd8\\u8dd9\\u8dda\\u8ddb\\u8ddc\\u8ddd\\u8dde\\u8ddf\\u8de0\\u8de1\\u8de2\\u8de3\\u8de4\\u8de5\\u8de6\\u8de7\\u8de8\\u8de9\\u8dea\\u8deb\\u8dec\\u8ded\\u8dee\\u8def\\u8df0\\u8df1\\u8df2\\u8df3\\u8df4\\u8df5\\u8df6\\u8df7\\u8df8\\u8df9\\u8dfa\\u8dfb\\u8dfc\\u8dfd\\u8dfe\\u8dff\\u8e00\\u8e01\\u8e02\\u8e03\\u8e04\\u8e05\\u8e06\\u8e07\\u8e08\\u8e09\\u8e0a\\u8e0b\\u8e0c\\u8e0d\\u8e0e\\u8e0f\\u8e10\\u8e11\\u8e12\\u8e13\\u8e14\\u8e15\\u8e16\\u8e17\\u8e18\\u8e19\\u8e1a\\u8e1b\\u8e1c\\u8e1d\\u8e1e\\u8e1f\\u8e20\\u8e21\\u8e22\\u8e23\\u8e24\\u8e25\\u8e26\\u8e27\\u8e28\\u8e29\\u8e2a\\u8e2b\\u8e2c\\u8e2d\\u8e2e\\u8e2f\\u8e30\\u8e31\\u8e32\\u8e33\\u8e34\\u8e35\\u8e36\\u8e37\\u8e38\\u8e39\\u8e3a\\u8e3b\\u8e3c\\u8e3d\\u8e3e\\u8e3f\\u8e40\\u8e41\\u8e42\\u8e43\\u8e44\\u8e45\\u8e46\\u8e47\\u8e48\\u8e49\\u8e4a\\u8e4b\\u8e4c\\u8e4d\\u8e4e\\u8e4f\\u8e50\\u8e51\\u8e52\\u8e53\\u8e54\\u8e55\\u8e56\\u8e57\\u8e58\\u8e59\\u8e5a\\u8e5b\\u8e5c\\u8e5d\\u8e5e\\u8e5f\\u8e60\\u8e61\\u8e62\\u8e63\\u8e64\\u8e65\\u8e66\\u8e67\\u8e68\\u8e69\\u8e6a\\u8e6b\\u8e6c\\u8e6d\\u8e6e\\u8e6f\\u8e70\\u8e71\\u8e72\\u8e73\\u8e74\\u8e75\\u8e76\\u8e77\\u8e78\\u8e79\\u8e7a\\u8e7b\\u8e7c\\u8e7d\\u8e7e\\u8e7f\\u8e80\\u8e81\\u8e82\\u8e83\\u8e84\\u8e85\\u8e86\\u8e87\\u8e88\\u8e89\\u8e8a\\u8e8b\\u8e8c\\u8e8d\\u8e8e\\u8e8f\\u8e90\\u8e91\\u8e92\\u8e93\\u8e94\\u8e95\\u8e96\\u8e97\\u8e98\\u8e99\\u8e9a\\u8e9b\\u8e9c\\u8e9d\\u8e9e\\u8e9f\\u8ea0\\u8ea1\\u8ea2\\u8ea3\\u8ea4\\u8ea5\\u8ea6\\u8ea7\\u8ea8\\u8ea9\\u8eaa\\u8eab\\u8eac\\u8ead\\u8eae\\u8eaf\\u8eb0\\u8eb1\\u8eb2\\u8eb3\\u8eb4\\u8eb5\\u8eb6\\u8eb7\\u8eb8\\u8eb9\\u8eba\\u8ebb\\u8ebc\\u8ebd\\u8ebe\\u8ebf\\u8ec0\\u8ec1\\u8ec2\\u8ec3\\u8ec4\\u8ec5\\u8ec6\\u8ec7\\u8ec8\\u8ec9\\u8eca\\u8ecb\\u8ecc\\u8ecd\\u8ece\\u8ecf\\u8ed0\\u8ed1\\u8ed2\\u8ed3\\u8ed4\\u8ed5\\u8ed6\\u8ed7\\u8ed8\\u8ed9\\u8eda\\u8edb\\u8edc\\u8edd\\u8ede\\u8edf\\u8ee0\\u8ee1\\u8ee2\\u8ee3\\u8ee4\\u8ee5\\u8ee6\\u8ee7\\u8ee8\\u8ee9\\u8eea\\u8eeb\\u8eec\\u8eed\\u8eee\\u8eef\\u8ef0\\u8ef1\\u8ef2\\u8ef3\\u8ef4\\u8ef5\\u8ef6\\u8ef7\\u8ef8\\u8ef9\\u8efa\\u8efb\\u8efc\\u8efd\\u8efe\\u8eff\\u8f00\\u8f01\\u8f02\\u8f03\\u8f04\\u8f05\\u8f06\\u8f07\\u8f08\\u8f09\\u8f0a\\u8f0b\\u8f0c\\u8f0d\\u8f0e\\u8f0f\\u8f10\\u8f11\\u8f12\\u8f13\\u8f14\\u8f15\\u8f16\\u8f17\\u8f18\\u8f19\\u8f1a\\u8f1b\\u8f1c\\u8f1d\\u8f1e\\u8f1f\\u8f20\\u8f21\\u8f22\\u8f23\\u8f24\\u8f25\\u8f26\\u8f27\\u8f28\\u8f29\\u8f2a\\u8f2b\\u8f2c\\u8f2d\\u8f2e\\u8f2f\\u8f30\\u8f31\\u8f32\\u8f33\\u8f34\\u8f35\\u8f36\\u8f37\\u8f38\\u8f39\\u8f3a\\u8f3b\\u8f3c\\u8f3d\\u8f3e\\u8f3f\\u8f40\\u8f41\\u8f42\\u8f43\\u8f44\\u8f45\\u8f46\\u8f47\\u8f48\\u8f49\\u8f4a\\u8f4b\\u8f4c\\u8f4d\\u8f4e\\u8f4f\\u8f50\\u8f51\\u8f52\\u8f53\\u8f54\\u8f55\\u8f56\\u8f57\\u8f58\\u8f59\\u8f5a\\u8f5b\\u8f5c\\u8f5d\\u8f5e\\u8f5f\\u8f60\\u8f61\\u8f62\\u8f63\\u8f64\\u8f65\\u8f66\\u8f67\\u8f68\\u8f69\\u8f6a\\u8f6b\\u8f6c\\u8f6d\\u8f6e\\u8f6f\\u8f70\\u8f71\\u8f72\\u8f73\\u8f74\\u8f75\\u8f76\\u8f77\\u8f78\\u8f79\\u8f7a\\u8f7b\\u8f7c\\u8f7d\\u8f7e\\u8f7f\\u8f80\\u8f81\\u8f82\\u8f83\\u8f84\\u8f85\\u8f86\\u8f87\\u8f88\\u8f89\\u8f8a\\u8f8b\\u8f8c\\u8f8d\\u8f8e\\u8f8f\\u8f90\\u8f91\\u8f92\\u8f93\\u8f94\\u8f95\\u8f96\\u8f97\\u8f98\\u8f99\\u8f9a\\u8f9b\\u8f9c\\u8f9d\\u8f9e\\u8f9f\\u8fa0\\u8fa1\\u8fa2\\u8fa3\\u8fa4\\u8fa5\\u8fa6\\u8fa7\\u8fa8\\u8fa9\\u8faa\\u8fab\\u8fac\\u8fad\\u8fae\\u8faf\\u8fb0\\u8fb1\\u8fb2\\u8fb3\\u8fb4\\u8fb5\\u8fb6\\u8fb7\\u8fb8\\u8fb9\\u8fba\\u8fbb\\u8fbc\\u8fbd\\u8fbe\\u8fbf\\u8fc0\\u8fc1\\u8fc2\\u8fc3\\u8fc4\\u8fc5\\u8fc6\\u8fc7\\u8fc8\\u8fc9\\u8fca\\u8fcb\\u8fcc\\u8fcd\\u8fce\\u8fcf\\u8fd0\\u8fd1\\u8fd2\\u8fd3\\u8fd4\\u8fd5\\u8fd6\\u8fd7\\u8fd8\\u8fd9\\u8fda\\u8fdb\\u8fdc\\u8fdd\\u8fde\\u8fdf\\u8fe0\\u8fe1\\u8fe2\\u8fe3\\u8fe4\\u8fe5\\u8fe6\\u8fe7\\u8fe8\\u8fe9\\u8fea\\u8feb\\u8fec\\u8fed\\u8fee\\u8fef\\u8ff0\\u8ff1\\u8ff2\\u8ff3\\u8ff4\\u8ff5\\u8ff6\\u8ff7\\u8ff8\\u8ff9\\u8ffa\\u8ffb\\u8ffc\\u8ffd\\u8ffe\\u8fff\\u9000\\u9001\\u9002\\u9003\\u9004\\u9005\\u9006\\u9007\\u9008\\u9009\\u900a\\u900b\\u900c\\u900d\\u900e\\u900f\\u9010\\u9011\\u9012\\u9013\\u9014\\u9015\\u9016\\u9017\\u9018\\u9019\\u901a\\u901b\\u901c\\u901d\\u901e\\u901f\\u9020\\u9021\\u9022\\u9023\\u9024\\u9025\\u9026\\u9027\\u9028\\u9029\\u902a\\u902b\\u902c\\u902d\\u902e\\u902f\\u9030\\u9031\\u9032\\u9033\\u9034\\u9035\\u9036\\u9037\\u9038\\u9039\\u903a\\u903b\\u903c\\u903d\\u903e\\u903f\\u9040\\u9041\\u9042\\u9043\\u9044\\u9045\\u9046\\u9047\\u9048\\u9049\\u904a\\u904b\\u904c\\u904d\\u904e\\u904f\\u9050\\u9051\\u9052\\u9053\\u9054\\u9055\\u9056\\u9057\\u9058\\u9059\\u905a\\u905b\\u905c\\u905d\\u905e\\u905f\\u9060\\u9061\\u9062\\u9063\\u9064\\u9065\\u9066\\u9067\\u9068\\u9069\\u906a\\u906b\\u906c\\u906d\\u906e\\u906f\\u9070\\u9071\\u9072\\u9073\\u9074\\u9075\\u9076\\u9077\\u9078\\u9079\\u907a\\u907b\\u907c\\u907d\\u907e\\u907f\\u9080\\u9081\\u9082\\u9083\\u9084\\u9085\\u9086\\u9087\\u9088\\u9089\\u908a\\u908b\\u908c\\u908d\\u908e\\u908f\\u9090\\u9091\\u9092\\u9093\\u9094\\u9095\\u9096\\u9097\\u9098\\u9099\\u909a\\u909b\\u909c\\u909d\\u909e\\u909f\\u90a0\\u90a1\\u90a2\\u90a3\\u90a4\\u90a5\\u90a6\\u90a7\\u90a8\\u90a9\\u90aa\\u90ab\\u90ac\\u90ad\\u90ae\\u90af\\u90b0\\u90b1\\u90b2\\u90b3\\u90b4\\u90b5\\u90b6\\u90b7\\u90b8\\u90b9\\u90ba\\u90bb\\u90bc\\u90bd\\u90be\\u90bf\\u90c0\\u90c1\\u90c2\\u90c3\\u90c4\\u90c5\\u90c6\\u90c7\\u90c8\\u90c9\\u90ca\\u90cb\\u90cc\\u90cd\\u90ce\\u90cf\\u90d0\\u90d1\\u90d2\\u90d3\\u90d4\\u90d5\\u90d6\\u90d7\\u90d8\\u90d9\\u90da\\u90db\\u90dc\\u90dd\\u90de\\u90df\\u90e0\\u90e1\\u90e2\\u90e3\\u90e4\\u90e5\\u90e6\\u90e7\\u90e8\\u90e9\\u90ea\\u90eb\\u90ec\\u90ed\\u90ee\\u90ef\\u90f0\\u90f1\\u90f2\\u90f3\\u90f4\\u90f5\\u90f6\\u90f7\\u90f8\\u90f9\\u90fa\\u90fb\\u90fc\\u90fd\\u90fe\\u90ff\\u9100\\u9101\\u9102\\u9103\\u9104\\u9105\\u9106\\u9107\\u9108\\u9109\\u910a\\u910b\\u910c\\u910d\\u910e\\u910f\\u9110\\u9111\\u9112\\u9113\\u9114\\u9115\\u9116\\u9117\\u9118\\u9119\\u911a\\u911b\\u911c\\u911d\\u911e\\u911f\\u9120\\u9121\\u9122\\u9123\\u9124\\u9125\\u9126\\u9127\\u9128\\u9129\\u912a\\u912b\\u912c\\u912d\\u912e\\u912f\\u9130\\u9131\\u9132\\u9133\\u9134\\u9135\\u9136\\u9137\\u9138\\u9139\\u913a\\u913b\\u913c\\u913d\\u913e\\u913f\\u9140\\u9141\\u9142\\u9143\\u9144\\u9145\\u9146\\u9147\\u9148\\u9149\\u914a\\u914b\\u914c\\u914d\\u914e\\u914f\\u9150\\u9151\\u9152\\u9153\\u9154\\u9155\\u9156\\u9157\\u9158\\u9159\\u915a\\u915b\\u915c\\u915d\\u915e\\u915f\\u9160\\u9161\\u9162\\u9163\\u9164\\u9165\\u9166\\u9167\\u9168\\u9169\\u916a\\u916b\\u916c\\u916d\\u916e\\u916f\\u9170\\u9171\\u9172\\u9173\\u9174\\u9175\\u9176\\u9177\\u9178\\u9179\\u917a\\u917b\\u917c\\u917d\\u917e\\u917f\\u9180\\u9181\\u9182\\u9183\\u9184\\u9185\\u9186\\u9187\\u9188\\u9189\\u918a\\u918b\\u918c\\u918d\\u918e\\u918f\\u9190\\u9191\\u9192\\u9193\\u9194\\u9195\\u9196\\u9197\\u9198\\u9199\\u919a\\u919b\\u919c\\u919d\\u919e\\u919f\\u91a0\\u91a1\\u91a2\\u91a3\\u91a4\\u91a5\\u91a6\\u91a7\\u91a8\\u91a9\\u91aa\\u91ab\\u91ac\\u91ad\\u91ae\\u91af\\u91b0\\u91b1\\u91b2\\u91b3\\u91b4\\u91b5\\u91b6\\u91b7\\u91b8\\u91b9\\u91ba\\u91bb\\u91bc\\u91bd\\u91be\\u91bf\\u91c0\\u91c1\\u91c2\\u91c3\\u91c4\\u91c5\\u91c6\\u91c7\\u91c8\\u91c9\\u91ca\\u91cb\\u91cc\\u91cd\\u91ce\\u91cf\\u91d0\\u91d1\\u91d2\\u91d3\\u91d4\\u91d5\\u91d6\\u91d7\\u91d8\\u91d9\\u91da\\u91db\\u91dc\\u91dd\\u91de\\u91df\\u91e0\\u91e1\\u91e2\\u91e3\\u91e4\\u91e5\\u91e6\\u91e7\\u91e8\\u91e9\\u91ea\\u91eb\\u91ec\\u91ed\\u91ee\\u91ef\\u91f0\\u91f1\\u91f2\\u91f3\\u91f4\\u91f5\\u91f6\\u91f7\\u91f8\\u91f9\\u91fa\\u91fb\\u91fc\\u91fd\\u91fe\\u91ff\\u9200\\u9201\\u9202\\u9203\\u9204\\u9205\\u9206\\u9207\\u9208\\u9209\\u920a\\u920b\\u920c\\u920d\\u920e\\u920f\\u9210\\u9211\\u9212\\u9213\\u9214\\u9215\\u9216\\u9217\\u9218\\u9219\\u921a\\u921b\\u921c\\u921d\\u921e\\u921f\\u9220\\u9221\\u9222\\u9223\\u9224\\u9225\\u9226\\u9227\\u9228\\u9229\\u922a\\u922b\\u922c\\u922d\\u922e\\u922f\\u9230\\u9231\\u9232\\u9233\\u9234\\u9235\\u9236\\u9237\\u9238\\u9239\\u923a\\u923b\\u923c\\u923d\\u923e\\u923f\\u9240\\u9241\\u9242\\u9243\\u9244\\u9245\\u9246\\u9247\\u9248\\u9249\\u924a\\u924b\\u924c\\u924d\\u924e\\u924f\\u9250\\u9251\\u9252\\u9253\\u9254\\u9255\\u9256\\u9257\\u9258\\u9259\\u925a\\u925b\\u925c\\u925d\\u925e\\u925f\\u9260\\u9261\\u9262\\u9263\\u9264\\u9265\\u9266\\u9267\\u9268\\u9269\\u926a\\u926b\\u926c\\u926d\\u926e\\u926f\\u9270\\u9271\\u9272\\u9273\\u9274\\u9275\\u9276\\u9277\\u9278\\u9279\\u927a\\u927b\\u927c\\u927d\\u927e\\u927f\\u9280\\u9281\\u9282\\u9283\\u9284\\u9285\\u9286\\u9287\\u9288\\u9289\\u928a\\u928b\\u928c\\u928d\\u928e\\u928f\\u9290\\u9291\\u9292\\u9293\\u9294\\u9295\\u9296\\u9297\\u9298\\u9299\\u929a\\u929b\\u929c\\u929d\\u929e\\u929f\\u92a0\\u92a1\\u92a2\\u92a3\\u92a4\\u92a5\\u92a6\\u92a7\\u92a8\\u92a9\\u92aa\\u92ab\\u92ac\\u92ad\\u92ae\\u92af\\u92b0\\u92b1\\u92b2\\u92b3\\u92b4\\u92b5\\u92b6\\u92b7\\u92b8\\u92b9\\u92ba\\u92bb\\u92bc\\u92bd\\u92be\\u92bf\\u92c0\\u92c1\\u92c2\\u92c3\\u92c4\\u92c5\\u92c6\\u92c7\\u92c8\\u92c9\\u92ca\\u92cb\\u92cc\\u92cd\\u92ce\\u92cf\\u92d0\\u92d1\\u92d2\\u92d3\\u92d4\\u92d5\\u92d6\\u92d7\\u92d8\\u92d9\\u92da\\u92db\\u92dc\\u92dd\\u92de\\u92df\\u92e0\\u92e1\\u92e2\\u92e3\\u92e4\\u92e5\\u92e6\\u92e7\\u92e8\\u92e9\\u92ea\\u92eb\\u92ec\\u92ed\\u92ee\\u92ef\\u92f0\\u92f1\\u92f2\\u92f3\\u92f4\\u92f5\\u92f6\\u92f7\\u92f8\\u92f9\\u92fa\\u92fb\\u92fc\\u92fd\\u92fe\\u92ff\\u9300\\u9301\\u9302\\u9303\\u9304\\u9305\\u9306\\u9307\\u9308\\u9309\\u930a\\u930b\\u930c\\u930d\\u930e\\u930f\\u9310\\u9311\\u9312\\u9313\\u9314\\u9315\\u9316\\u9317\\u9318\\u9319\\u931a\\u931b\\u931c\\u931d\\u931e\\u931f\\u9320\\u9321\\u9322\\u9323\\u9324\\u9325\\u9326\\u9327\\u9328\\u9329\\u932a\\u932b\\u932c\\u932d\\u932e\\u932f\\u9330\\u9331\\u9332\\u9333\\u9334\\u9335\\u9336\\u9337\\u9338\\u9339\\u933a\\u933b\\u933c\\u933d\\u933e\\u933f\\u9340\\u9341\\u9342\\u9343\\u9344\\u9345\\u9346\\u9347\\u9348\\u9349\\u934a\\u934b\\u934c\\u934d\\u934e\\u934f\\u9350\\u9351\\u9352\\u9353\\u9354\\u9355\\u9356\\u9357\\u9358\\u9359\\u935a\\u935b\\u935c\\u935d\\u935e\\u935f\\u9360\\u9361\\u9362\\u9363\\u9364\\u9365\\u9366\\u9367\\u9368\\u9369\\u936a\\u936b\\u936c\\u936d\\u936e\\u936f\\u9370\\u9371\\u9372\\u9373\\u9374\\u9375\\u9376\\u9377\\u9378\\u9379\\u937a\\u937b\\u937c\\u937d\\u937e\\u937f\\u9380\\u9381\\u9382\\u9383\\u9384\\u9385\\u9386\\u9387\\u9388\\u9389\\u938a\\u938b\\u938c\\u938d\\u938e\\u938f\\u9390\\u9391\\u9392\\u9393\\u9394\\u9395\\u9396\\u9397\\u9398\\u9399\\u939a\\u939b\\u939c\\u939d\\u939e\\u939f\\u93a0\\u93a1\\u93a2\\u93a3\\u93a4\\u93a5\\u93a6\\u93a7\\u93a8\\u93a9\\u93aa\\u93ab\\u93ac\\u93ad\\u93ae\\u93af\\u93b0\\u93b1\\u93b2\\u93b3\\u93b4\\u93b5\\u93b6\\u93b7\\u93b8\\u93b9\\u93ba\\u93bb\\u93bc\\u93bd\\u93be\\u93bf\\u93c0\\u93c1\\u93c2\\u93c3\\u93c4\\u93c5\\u93c6\\u93c7\\u93c8\\u93c9\\u93ca\\u93cb\\u93cc\\u93cd\\u93ce\\u93cf\\u93d0\\u93d1\\u93d2\\u93d3\\u93d4\\u93d5\\u93d6\\u93d7\\u93d8\\u93d9\\u93da\\u93db\\u93dc\\u93dd\\u93de\\u93df\\u93e0\\u93e1\\u93e2\\u93e3\\u93e4\\u93e5\\u93e6\\u93e7\\u93e8\\u93e9\\u93ea\\u93eb\\u93ec\\u93ed\\u93ee\\u93ef\\u93f0\\u93f1\\u93f2\\u93f3\\u93f4\\u93f5\\u93f6\\u93f7\\u93f8\\u93f9\\u93fa\\u93fb\\u93fc\\u93fd\\u93fe\\u93ff\\u9400\\u9401\\u9402\\u9403\\u9404\\u9405\\u9406\\u9407\\u9408\\u9409\\u940a\\u940b\\u940c\\u940d\\u940e\\u940f\\u9410\\u9411\\u9412\\u9413\\u9414\\u9415\\u9416\\u9417\\u9418\\u9419\\u941a\\u941b\\u941c\\u941d\\u941e\\u941f\\u9420\\u9421\\u9422\\u9423\\u9424\\u9425\\u9426\\u9427\\u9428\\u9429\\u942a\\u942b\\u942c\\u942d\\u942e\\u942f\\u9430\\u9431\\u9432\\u9433\\u9434\\u9435\\u9436\\u9437\\u9438\\u9439\\u943a\\u943b\\u943c\\u943d\\u943e\\u943f\\u9440\\u9441\\u9442\\u9443\\u9444\\u9445\\u9446\\u9447\\u9448\\u9449\\u944a\\u944b\\u944c\\u944d\\u944e\\u944f\\u9450\\u9451\\u9452\\u9453\\u9454\\u9455\\u9456\\u9457\\u9458\\u9459\\u945a\\u945b\\u945c\\u945d\\u945e\\u945f\\u9460\\u9461\\u9462\\u9463\\u9464\\u9465\\u9466\\u9467\\u9468\\u9469\\u946a\\u946b\\u946c\\u946d\\u946e\\u946f\\u9470\\u9471\\u9472\\u9473\\u9474\\u9475\\u9476\\u9477\\u9478\\u9479\\u947a\\u947b\\u947c\\u947d\\u947e\\u947f\\u9480\\u9481\\u9482\\u9483\\u9484\\u9485\\u9486\\u9487\\u9488\\u9489\\u948a\\u948b\\u948c\\u948d\\u948e\\u948f\\u9490\\u9491\\u9492\\u9493\\u9494\\u9495\\u9496\\u9497\\u9498\\u9499\\u949a\\u949b\\u949c\\u949d\\u949e\\u949f\\u94a0\\u94a1\\u94a2\\u94a3\\u94a4\\u94a5\\u94a6\\u94a7\\u94a8\\u94a9\\u94aa\\u94ab\\u94ac\\u94ad\\u94ae\\u94af\\u94b0\\u94b1\\u94b2\\u94b3\\u94b4\\u94b5\\u94b6\\u94b7\\u94b8\\u94b9\\u94ba\\u94bb\\u94bc\\u94bd\\u94be\\u94bf\\u94c0\\u94c1\\u94c2\\u94c3\\u94c4\\u94c5\\u94c6\\u94c7\\u94c8\\u94c9\\u94ca\\u94cb\\u94cc\\u94cd\\u94ce\\u94cf\\u94d0\\u94d1\\u94d2\\u94d3\\u94d4\\u94d5\\u94d6\\u94d7\\u94d8\\u94d9\\u94da\\u94db\\u94dc\\u94dd\\u94de\\u94df\\u94e0\\u94e1\\u94e2\\u94e3\\u94e4\\u94e5\\u94e6\\u94e7\\u94e8\\u94e9\\u94ea\\u94eb\\u94ec\\u94ed\\u94ee\\u94ef\\u94f0\\u94f1\\u94f2\\u94f3\\u94f4\\u94f5\\u94f6\\u94f7\\u94f8\\u94f9\\u94fa\\u94fb\\u94fc\\u94fd\\u94fe\\u94ff\\u9500\\u9501\\u9502\\u9503\\u9504\\u9505\\u9506\\u9507\\u9508\\u9509\\u950a\\u950b\\u950c\\u950d\\u950e\\u950f\\u9510\\u9511\\u9512\\u9513\\u9514\\u9515\\u9516\\u9517\\u9518\\u9519\\u951a\\u951b\\u951c\\u951d\\u951e\\u951f\\u9520\\u9521\\u9522\\u9523\\u9524\\u9525\\u9526\\u9527\\u9528\\u9529\\u952a\\u952b\\u952c\\u952d\\u952e\\u952f\\u9530\\u9531\\u9532\\u9533\\u9534\\u9535\\u9536\\u9537\\u9538\\u9539\\u953a\\u953b\\u953c\\u953d\\u953e\\u953f\\u9540\\u9541\\u9542\\u9543\\u9544\\u9545\\u9546\\u9547\\u9548\\u9549\\u954a\\u954b\\u954c\\u954d\\u954e\\u954f\\u9550\\u9551\\u9552\\u9553\\u9554\\u9555\\u9556\\u9557\\u9558\\u9559\\u955a\\u955b\\u955c\\u955d\\u955e\\u955f\\u9560\\u9561\\u9562\\u9563\\u9564\\u9565\\u9566\\u9567\\u9568\\u9569\\u956a\\u956b\\u956c\\u956d\\u956e\\u956f\\u9570\\u9571\\u9572\\u9573\\u9574\\u9575\\u9576\\u9577\\u9578\\u9579\\u957a\\u957b\\u957c\\u957d\\u957e\\u957f\\u9580\\u9581\\u9582\\u9583\\u9584\\u9585\\u9586\\u9587\\u9588\\u9589\\u958a\\u958b\\u958c\\u958d\\u958e\\u958f\\u9590\\u9591\\u9592\\u9593\\u9594\\u9595\\u9596\\u9597\\u9598\\u9599\\u959a\\u959b\\u959c\\u959d\\u959e\\u959f\\u95a0\\u95a1\\u95a2\\u95a3\\u95a4\\u95a5\\u95a6\\u95a7\\u95a8\\u95a9\\u95aa\\u95ab\\u95ac\\u95ad\\u95ae\\u95af\\u95b0\\u95b1\\u95b2\\u95b3\\u95b4\\u95b5\\u95b6\\u95b7\\u95b8\\u95b9\\u95ba\\u95bb\\u95bc\\u95bd\\u95be\\u95bf\\u95c0\\u95c1\\u95c2\\u95c3\\u95c4\\u95c5\\u95c6\\u95c7\\u95c8\\u95c9\\u95ca\\u95cb\\u95cc\\u95cd\\u95ce\\u95cf\\u95d0\\u95d1\\u95d2\\u95d3\\u95d4\\u95d5\\u95d6\\u95d7\\u95d8\\u95d9\\u95da\\u95db\\u95dc\\u95dd\\u95de\\u95df\\u95e0\\u95e1\\u95e2\\u95e3\\u95e4\\u95e5\\u95e6\\u95e7\\u95e8\\u95e9\\u95ea\\u95eb\\u95ec\\u95ed\\u95ee\\u95ef\\u95f0\\u95f1\\u95f2\\u95f3\\u95f4\\u95f5\\u95f6\\u95f7\\u95f8\\u95f9\\u95fa\\u95fb\\u95fc\\u95fd\\u95fe\\u95ff\\u9600\\u9601\\u9602\\u9603\\u9604\\u9605\\u9606\\u9607\\u9608\\u9609\\u960a\\u960b\\u960c\\u960d\\u960e\\u960f\\u9610\\u9611\\u9612\\u9613\\u9614\\u9615\\u9616\\u9617\\u9618\\u9619\\u961a\\u961b\\u961c\\u961d\\u961e\\u961f\\u9620\\u9621\\u9622\\u9623\\u9624\\u9625\\u9626\\u9627\\u9628\\u9629\\u962a\\u962b\\u962c\\u962d\\u962e\\u962f\\u9630\\u9631\\u9632\\u9633\\u9634\\u9635\\u9636\\u9637\\u9638\\u9639\\u963a\\u963b\\u963c\\u963d\\u963e\\u963f\\u9640\\u9641\\u9642\\u9643\\u9644\\u9645\\u9646\\u9647\\u9648\\u9649\\u964a\\u964b\\u964c\\u964d\\u964e\\u964f\\u9650\\u9651\\u9652\\u9653\\u9654\\u9655\\u9656\\u9657\\u9658\\u9659\\u965a\\u965b\\u965c\\u965d\\u965e\\u965f\\u9660\\u9661\\u9662\\u9663\\u9664\\u9665\\u9666\\u9667\\u9668\\u9669\\u966a\\u966b\\u966c\\u966d\\u966e\\u966f\\u9670\\u9671\\u9672\\u9673\\u9674\\u9675\\u9676\\u9677\\u9678\\u9679\\u967a\\u967b\\u967c\\u967d\\u967e\\u967f\\u9680\\u9681\\u9682\\u9683\\u9684\\u9685\\u9686\\u9687\\u9688\\u9689\\u968a\\u968b\\u968c\\u968d\\u968e\\u968f\\u9690\\u9691\\u9692\\u9693\\u9694\\u9695\\u9696\\u9697\\u9698\\u9699\\u969a\\u969b\\u969c\\u969d\\u969e\\u969f\\u96a0\\u96a1\\u96a2\\u96a3\\u96a4\\u96a5\\u96a6\\u96a7\\u96a8\\u96a9\\u96aa\\u96ab\\u96ac\\u96ad\\u96ae\\u96af\\u96b0\\u96b1\\u96b2\\u96b3\\u96b4\\u96b5\\u96b6\\u96b7\\u96b8\\u96b9\\u96ba\\u96bb\\u96bc\\u96bd\\u96be\\u96bf\\u96c0\\u96c1\\u96c2\\u96c3\\u96c4\\u96c5\\u96c6\\u96c7\\u96c8\\u96c9\\u96ca\\u96cb\\u96cc\\u96cd\\u96ce\\u96cf\\u96d0\\u96d1\\u96d2\\u96d3\\u96d4\\u96d5\\u96d6\\u96d7\\u96d8\\u96d9\\u96da\\u96db\\u96dc\\u96dd\\u96de\\u96df\\u96e0\\u96e1\\u96e2\\u96e3\\u96e4\\u96e5\\u96e6\\u96e7\\u96e8\\u96e9\\u96ea\\u96eb\\u96ec\\u96ed\\u96ee\\u96ef\\u96f0\\u96f1\\u96f2\\u96f3\\u96f4\\u96f5\\u96f6\\u96f7\\u96f8\\u96f9\\u96fa\\u96fb\\u96fc\\u96fd\\u96fe\\u96ff\\u9700\\u9701\\u9702\\u9703\\u9704\\u9705\\u9706\\u9707\\u9708\\u9709\\u970a\\u970b\\u970c\\u970d\\u970e\\u970f\\u9710\\u9711\\u9712\\u9713\\u9714\\u9715\\u9716\\u9717\\u9718\\u9719\\u971a\\u971b\\u971c\\u971d\\u971e\\u971f\\u9720\\u9721\\u9722\\u9723\\u9724\\u9725\\u9726\\u9727\\u9728\\u9729\\u972a\\u972b\\u972c\\u972d\\u972e\\u972f\\u9730\\u9731\\u9732\\u9733\\u9734\\u9735\\u9736\\u9737\\u9738\\u9739\\u973a\\u973b\\u973c\\u973d\\u973e\\u973f\\u9740\\u9741\\u9742\\u9743\\u9744\\u9745\\u9746\\u9747\\u9748\\u9749\\u974a\\u974b\\u974c\\u974d\\u974e\\u974f\\u9750\\u9751\\u9752\\u9753\\u9754\\u9755\\u9756\\u9757\\u9758\\u9759\\u975a\\u975b\\u975c\\u975d\\u975e\\u975f\\u9760\\u9761\\u9762\\u9763\\u9764\\u9765\\u9766\\u9767\\u9768\\u9769\\u976a\\u976b\\u976c\\u976d\\u976e\\u976f\\u9770\\u9771\\u9772\\u9773\\u9774\\u9775\\u9776\\u9777\\u9778\\u9779\\u977a\\u977b\\u977c\\u977d\\u977e\\u977f\\u9780\\u9781\\u9782\\u9783\\u9784\\u9785\\u9786\\u9787\\u9788\\u9789\\u978a\\u978b\\u978c\\u978d\\u978e\\u978f\\u9790\\u9791\\u9792\\u9793\\u9794\\u9795\\u9796\\u9797\\u9798\\u9799\\u979a\\u979b\\u979c\\u979d\\u979e\\u979f\\u97a0\\u97a1\\u97a2\\u97a3\\u97a4\\u97a5\\u97a6\\u97a7\\u97a8\\u97a9\\u97aa\\u97ab\\u97ac\\u97ad\\u97ae\\u97af\\u97b0\\u97b1\\u97b2\\u97b3\\u97b4\\u97b5\\u97b6\\u97b7\\u97b8\\u97b9\\u97ba\\u97bb\\u97bc\\u97bd\\u97be\\u97bf\\u97c0\\u97c1\\u97c2\\u97c3\\u97c4\\u97c5\\u97c6\\u97c7\\u97c8\\u97c9\\u97ca\\u97cb\\u97cc\\u97cd\\u97ce\\u97cf\\u97d0\\u97d1\\u97d2\\u97d3\\u97d4\\u97d5\\u97d6\\u97d7\\u97d8\\u97d9\\u97da\\u97db\\u97dc\\u97dd\\u97de\\u97df\\u97e0\\u97e1\\u97e2\\u97e3\\u97e4\\u97e5\\u97e6\\u97e7\\u97e8\\u97e9\\u97ea\\u97eb\\u97ec\\u97ed\\u97ee\\u97ef\\u97f0\\u97f1\\u97f2\\u97f3\\u97f4\\u97f5\\u97f6\\u97f7\\u97f8\\u97f9\\u97fa\\u97fb\\u97fc\\u97fd\\u97fe\\u97ff\\u9800\\u9801\\u9802\\u9803\\u9804\\u9805\\u9806\\u9807\\u9808\\u9809\\u980a\\u980b\\u980c\\u980d\\u980e\\u980f\\u9810\\u9811\\u9812\\u9813\\u9814\\u9815\\u9816\\u9817\\u9818\\u9819\\u981a\\u981b\\u981c\\u981d\\u981e\\u981f\\u9820\\u9821\\u9822\\u9823\\u9824\\u9825\\u9826\\u9827\\u9828\\u9829\\u982a\\u982b\\u982c\\u982d\\u982e\\u982f\\u9830\\u9831\\u9832\\u9833\\u9834\\u9835\\u9836\\u9837\\u9838\\u9839\\u983a\\u983b\\u983c\\u983d\\u983e\\u983f\\u9840\\u9841\\u9842\\u9843\\u9844\\u9845\\u9846\\u9847\\u9848\\u9849\\u984a\\u984b\\u984c\\u984d\\u984e\\u984f\\u9850\\u9851\\u9852\\u9853\\u9854\\u9855\\u9856\\u9857\\u9858\\u9859\\u985a\\u985b\\u985c\\u985d\\u985e\\u985f\\u9860\\u9861\\u9862\\u9863\\u9864\\u9865\\u9866\\u9867\\u9868\\u9869\\u986a\\u986b\\u986c\\u986d\\u986e\\u986f\\u9870\\u9871\\u9872\\u9873\\u9874\\u9875\\u9876\\u9877\\u9878\\u9879\\u987a\\u987b\\u987c\\u987d\\u987e\\u987f\\u9880\\u9881\\u9882\\u9883\\u9884\\u9885\\u9886\\u9887\\u9888\\u9889\\u988a\\u988b\\u988c\\u988d\\u988e\\u988f\\u9890\\u9891\\u9892\\u9893\\u9894\\u9895\\u9896\\u9897\\u9898\\u9899\\u989a\\u989b\\u989c\\u989d\\u989e\\u989f\\u98a0\\u98a1\\u98a2\\u98a3\\u98a4\\u98a5\\u98a6\\u98a7\\u98a8\\u98a9\\u98aa\\u98ab\\u98ac\\u98ad\\u98ae\\u98af\\u98b0\\u98b1\\u98b2\\u98b3\\u98b4\\u98b5\\u98b6\\u98b7\\u98b8\\u98b9\\u98ba\\u98bb\\u98bc\\u98bd\\u98be\\u98bf\\u98c0\\u98c1\\u98c2\\u98c3\\u98c4\\u98c5\\u98c6\\u98c7\\u98c8\\u98c9\\u98ca\\u98cb\\u98cc\\u98cd\\u98ce\\u98cf\\u98d0\\u98d1\\u98d2\\u98d3\\u98d4\\u98d5\\u98d6\\u98d7\\u98d8\\u98d9\\u98da\\u98db\\u98dc\\u98dd\\u98de\\u98df\\u98e0\\u98e1\\u98e2\\u98e3\\u98e4\\u98e5\\u98e6\\u98e7\\u98e8\\u98e9\\u98ea\\u98eb\\u98ec\\u98ed\\u98ee\\u98ef\\u98f0\\u98f1\\u98f2\\u98f3\\u98f4\\u98f5\\u98f6\\u98f7\\u98f8\\u98f9\\u98fa\\u98fb\\u98fc\\u98fd\\u98fe\\u98ff\\u9900\\u9901\\u9902\\u9903\\u9904\\u9905\\u9906\\u9907\\u9908\\u9909\\u990a\\u990b\\u990c\\u990d\\u990e\\u990f\\u9910\\u9911\\u9912\\u9913\\u9914\\u9915\\u9916\\u9917\\u9918\\u9919\\u991a\\u991b\\u991c\\u991d\\u991e\\u991f\\u9920\\u9921\\u9922\\u9923\\u9924\\u9925\\u9926\\u9927\\u9928\\u9929\\u992a\\u992b\\u992c\\u992d\\u992e\\u992f\\u9930\\u9931\\u9932\\u9933\\u9934\\u9935\\u9936\\u9937\\u9938\\u9939\\u993a\\u993b\\u993c\\u993d\\u993e\\u993f\\u9940\\u9941\\u9942\\u9943\\u9944\\u9945\\u9946\\u9947\\u9948\\u9949\\u994a\\u994b\\u994c\\u994d\\u994e\\u994f\\u9950\\u9951\\u9952\\u9953\\u9954\\u9955\\u9956\\u9957\\u9958\\u9959\\u995a\\u995b\\u995c\\u995d\\u995e\\u995f\\u9960\\u9961\\u9962\\u9963\\u9964\\u9965\\u9966\\u9967\\u9968\\u9969\\u996a\\u996b\\u996c\\u996d\\u996e\\u996f\\u9970\\u9971\\u9972\\u9973\\u9974\\u9975\\u9976\\u9977\\u9978\\u9979\\u997a\\u997b\\u997c\\u997d\\u997e\\u997f\\u9980\\u9981\\u9982\\u9983\\u9984\\u9985\\u9986\\u9987\\u9988\\u9989\\u998a\\u998b\\u998c\\u998d\\u998e\\u998f\\u9990\\u9991\\u9992\\u9993\\u9994\\u9995\\u9996\\u9997\\u9998\\u9999\\u999a\\u999b\\u999c\\u999d\\u999e\\u999f\\u99a0\\u99a1\\u99a2\\u99a3\\u99a4\\u99a5\\u99a6\\u99a7\\u99a8\\u99a9\\u99aa\\u99ab\\u99ac\\u99ad\\u99ae\\u99af\\u99b0\\u99b1\\u99b2\\u99b3\\u99b4\\u99b5\\u99b6\\u99b7\\u99b8\\u99b9\\u99ba\\u99bb\\u99bc\\u99bd\\u99be\\u99bf\\u99c0\\u99c1\\u99c2\\u99c3\\u99c4\\u99c5\\u99c6\\u99c7\\u99c8\\u99c9\\u99ca\\u99cb\\u99cc\\u99cd\\u99ce\\u99cf\\u99d0\\u99d1\\u99d2\\u99d3\\u99d4\\u99d5\\u99d6\\u99d7\\u99d8\\u99d9\\u99da\\u99db\\u99dc\\u99dd\\u99de\\u99df\\u99e0\\u99e1\\u99e2\\u99e3\\u99e4\\u99e5\\u99e6\\u99e7\\u99e8\\u99e9\\u99ea\\u99eb\\u99ec\\u99ed\\u99ee\\u99ef\\u99f0\\u99f1\\u99f2\\u99f3\\u99f4\\u99f5\\u99f6\\u99f7\\u99f8\\u99f9\\u99fa\\u99fb\\u99fc\\u99fd\\u99fe\\u99ff\\u9a00\\u9a01\\u9a02\\u9a03\\u9a04\\u9a05\\u9a06\\u9a07\\u9a08\\u9a09\\u9a0a\\u9a0b\\u9a0c\\u9a0d\\u9a0e\\u9a0f\\u9a10\\u9a11\\u9a12\\u9a13\\u9a14\\u9a15\\u9a16\\u9a17\\u9a18\\u9a19\\u9a1a\\u9a1b\\u9a1c\\u9a1d\\u9a1e\\u9a1f\\u9a20\\u9a21\\u9a22\\u9a23\\u9a24\\u9a25\\u9a26\\u9a27\\u9a28\\u9a29\\u9a2a\\u9a2b\\u9a2c\\u9a2d\\u9a2e\\u9a2f\\u9a30\\u9a31\\u9a32\\u9a33\\u9a34\\u9a35\\u9a36\\u9a37\\u9a38\\u9a39\\u9a3a\\u9a3b\\u9a3c\\u9a3d\\u9a3e\\u9a3f\\u9a40\\u9a41\\u9a42\\u9a43\\u9a44\\u9a45\\u9a46\\u9a47\\u9a48\\u9a49\\u9a4a\\u9a4b\\u9a4c\\u9a4d\\u9a4e\\u9a4f\\u9a50\\u9a51\\u9a52\\u9a53\\u9a54\\u9a55\\u9a56\\u9a57\\u9a58\\u9a59\\u9a5a\\u9a5b\\u9a5c\\u9a5d\\u9a5e\\u9a5f\\u9a60\\u9a61\\u9a62\\u9a63\\u9a64\\u9a65\\u9a66\\u9a67\\u9a68\\u9a69\\u9a6a\\u9a6b\\u9a6c\\u9a6d\\u9a6e\\u9a6f\\u9a70\\u9a71\\u9a72\\u9a73\\u9a74\\u9a75\\u9a76\\u9a77\\u9a78\\u9a79\\u9a7a\\u9a7b\\u9a7c\\u9a7d\\u9a7e\\u9a7f\\u9a80\\u9a81\\u9a82\\u9a83\\u9a84\\u9a85\\u9a86\\u9a87\\u9a88\\u9a89\\u9a8a\\u9a8b\\u9a8c\\u9a8d\\u9a8e\\u9a8f\\u9a90\\u9a91\\u9a92\\u9a93\\u9a94\\u9a95\\u9a96\\u9a97\\u9a98\\u9a99\\u9a9a\\u9a9b\\u9a9c\\u9a9d\\u9a9e\\u9a9f\\u9aa0\\u9aa1\\u9aa2\\u9aa3\\u9aa4\\u9aa5\\u9aa6\\u9aa7\\u9aa8\\u9aa9\\u9aaa\\u9aab\\u9aac\\u9aad\\u9aae\\u9aaf\\u9ab0\\u9ab1\\u9ab2\\u9ab3\\u9ab4\\u9ab5\\u9ab6\\u9ab7\\u9ab8\\u9ab9\\u9aba\\u9abb\\u9abc\\u9abd\\u9abe\\u9abf\\u9ac0\\u9ac1\\u9ac2\\u9ac3\\u9ac4\\u9ac5\\u9ac6\\u9ac7\\u9ac8\\u9ac9\\u9aca\\u9acb\\u9acc\\u9acd\\u9ace\\u9acf\\u9ad0\\u9ad1\\u9ad2\\u9ad3\\u9ad4\\u9ad5\\u9ad6\\u9ad7\\u9ad8\\u9ad9\\u9ada\\u9adb\\u9adc\\u9add\\u9ade\\u9adf\\u9ae0\\u9ae1\\u9ae2\\u9ae3\\u9ae4\\u9ae5\\u9ae6\\u9ae7\\u9ae8\\u9ae9\\u9aea\\u9aeb\\u9aec\\u9aed\\u9aee\\u9aef\\u9af0\\u9af1\\u9af2\\u9af3\\u9af4\\u9af5\\u9af6\\u9af7\\u9af8\\u9af9\\u9afa\\u9afb\\u9afc\\u9afd\\u9afe\\u9aff\\u9b00\\u9b01\\u9b02\\u9b03\\u9b04\\u9b05\\u9b06\\u9b07\\u9b08\\u9b09\\u9b0a\\u9b0b\\u9b0c\\u9b0d\\u9b0e\\u9b0f\\u9b10\\u9b11\\u9b12\\u9b13\\u9b14\\u9b15\\u9b16\\u9b17\\u9b18\\u9b19\\u9b1a\\u9b1b\\u9b1c\\u9b1d\\u9b1e\\u9b1f\\u9b20\\u9b21\\u9b22\\u9b23\\u9b24\\u9b25\\u9b26\\u9b27\\u9b28\\u9b29\\u9b2a\\u9b2b\\u9b2c\\u9b2d\\u9b2e\\u9b2f\\u9b30\\u9b31\\u9b32\\u9b33\\u9b34\\u9b35\\u9b36\\u9b37\\u9b38\\u9b39\\u9b3a\\u9b3b\\u9b3c\\u9b3d\\u9b3e\\u9b3f\\u9b40\\u9b41\\u9b42\\u9b43\\u9b44\\u9b45\\u9b46\\u9b47\\u9b48\\u9b49\\u9b4a\\u9b4b\\u9b4c\\u9b4d\\u9b4e\\u9b4f\\u9b50\\u9b51\\u9b52\\u9b53\\u9b54\\u9b55\\u9b56\\u9b57\\u9b58\\u9b59\\u9b5a\\u9b5b\\u9b5c\\u9b5d\\u9b5e\\u9b5f\\u9b60\\u9b61\\u9b62\\u9b63\\u9b64\\u9b65\\u9b66\\u9b67\\u9b68\\u9b69\\u9b6a\\u9b6b\\u9b6c\\u9b6d\\u9b6e\\u9b6f\\u9b70\\u9b71\\u9b72\\u9b73\\u9b74\\u9b75\\u9b76\\u9b77\\u9b78\\u9b79\\u9b7a\\u9b7b\\u9b7c\\u9b7d\\u9b7e\\u9b7f\\u9b80\\u9b81\\u9b82\\u9b83\\u9b84\\u9b85\\u9b86\\u9b87\\u9b88\\u9b89\\u9b8a\\u9b8b\\u9b8c\\u9b8d\\u9b8e\\u9b8f\\u9b90\\u9b91\\u9b92\\u9b93\\u9b94\\u9b95\\u9b96\\u9b97\\u9b98\\u9b99\\u9b9a\\u9b9b\\u9b9c\\u9b9d\\u9b9e\\u9b9f\\u9ba0\\u9ba1\\u9ba2\\u9ba3\\u9ba4\\u9ba5\\u9ba6\\u9ba7\\u9ba8\\u9ba9\\u9baa\\u9bab\\u9bac\\u9bad\\u9bae\\u9baf\\u9bb0\\u9bb1\\u9bb2\\u9bb3\\u9bb4\\u9bb5\\u9bb6\\u9bb7\\u9bb8\\u9bb9\\u9bba\\u9bbb\\u9bbc\\u9bbd\\u9bbe\\u9bbf\\u9bc0\\u9bc1\\u9bc2\\u9bc3\\u9bc4\\u9bc5\\u9bc6\\u9bc7\\u9bc8\\u9bc9\\u9bca\\u9bcb\\u9bcc\\u9bcd\\u9bce\\u9bcf\\u9bd0\\u9bd1\\u9bd2\\u9bd3\\u9bd4\\u9bd5\\u9bd6\\u9bd7\\u9bd8\\u9bd9\\u9bda\\u9bdb\\u9bdc\\u9bdd\\u9bde\\u9bdf\\u9be0\\u9be1\\u9be2\\u9be3\\u9be4\\u9be5\\u9be6\\u9be7\\u9be8\\u9be9\\u9bea\\u9beb\\u9bec\\u9bed\\u9bee\\u9bef\\u9bf0\\u9bf1\\u9bf2\\u9bf3\\u9bf4\\u9bf5\\u9bf6\\u9bf7\\u9bf8\\u9bf9\\u9bfa\\u9bfb\\u9bfc\\u9bfd\\u9bfe\\u9bff\\u9c00\\u9c01\\u9c02\\u9c03\\u9c04\\u9c05\\u9c06\\u9c07\\u9c08\\u9c09\\u9c0a\\u9c0b\\u9c0c\\u9c0d\\u9c0e\\u9c0f\\u9c10\\u9c11\\u9c12\\u9c13\\u9c14\\u9c15\\u9c16\\u9c17\\u9c18\\u9c19\\u9c1a\\u9c1b\\u9c1c\\u9c1d\\u9c1e\\u9c1f\\u9c20\\u9c21\\u9c22\\u9c23\\u9c24\\u9c25\\u9c26\\u9c27\\u9c28\\u9c29\\u9c2a\\u9c2b\\u9c2c\\u9c2d\\u9c2e\\u9c2f\\u9c30\\u9c31\\u9c32\\u9c33\\u9c34\\u9c35\\u9c36\\u9c37\\u9c38\\u9c39\\u9c3a\\u9c3b\\u9c3c\\u9c3d\\u9c3e\\u9c3f\\u9c40\\u9c41\\u9c42\\u9c43\\u9c44\\u9c45\\u9c46\\u9c47\\u9c48\\u9c49\\u9c4a\\u9c4b\\u9c4c\\u9c4d\\u9c4e\\u9c4f\\u9c50\\u9c51\\u9c52\\u9c53\\u9c54\\u9c55\\u9c56\\u9c57\\u9c58\\u9c59\\u9c5a\\u9c5b\\u9c5c\\u9c5d\\u9c5e\\u9c5f\\u9c60\\u9c61\\u9c62\\u9c63\\u9c64\\u9c65\\u9c66\\u9c67\\u9c68\\u9c69\\u9c6a\\u9c6b\\u9c6c\\u9c6d\\u9c6e\\u9c6f\\u9c70\\u9c71\\u9c72\\u9c73\\u9c74\\u9c75\\u9c76\\u9c77\\u9c78\\u9c79\\u9c7a\\u9c7b\\u9c7c\\u9c7d\\u9c7e\\u9c7f\\u9c80\\u9c81\\u9c82\\u9c83\\u9c84\\u9c85\\u9c86\\u9c87\\u9c88\\u9c89\\u9c8a\\u9c8b\\u9c8c\\u9c8d\\u9c8e\\u9c8f\\u9c90\\u9c91\\u9c92\\u9c93\\u9c94\\u9c95\\u9c96\\u9c97\\u9c98\\u9c99\\u9c9a\\u9c9b\\u9c9c\\u9c9d\\u9c9e\\u9c9f\\u9ca0\\u9ca1\\u9ca2\\u9ca3\\u9ca4\\u9ca5\\u9ca6\\u9ca7\\u9ca8\\u9ca9\\u9caa\\u9cab\\u9cac\\u9cad\\u9cae\\u9caf\\u9cb0\\u9cb1\\u9cb2\\u9cb3\\u9cb4\\u9cb5\\u9cb6\\u9cb7\\u9cb8\\u9cb9\\u9cba\\u9cbb\\u9cbc\\u9cbd\\u9cbe\\u9cbf\\u9cc0\\u9cc1\\u9cc2\\u9cc3\\u9cc4\\u9cc5\\u9cc6\\u9cc7\\u9cc8\\u9cc9\\u9cca\\u9ccb\\u9ccc\\u9ccd\\u9cce\\u9ccf\\u9cd0\\u9cd1\\u9cd2\\u9cd3\\u9cd4\\u9cd5\\u9cd6\\u9cd7\\u9cd8\\u9cd9\\u9cda\\u9cdb\\u9cdc\\u9cdd\\u9cde\\u9cdf\\u9ce0\\u9ce1\\u9ce2\\u9ce3\\u9ce4\\u9ce5\\u9ce6\\u9ce7\\u9ce8\\u9ce9\\u9cea\\u9ceb\\u9cec\\u9ced\\u9cee\\u9cef\\u9cf0\\u9cf1\\u9cf2\\u9cf3\\u9cf4\\u9cf5\\u9cf6\\u9cf7\\u9cf8\\u9cf9\\u9cfa\\u9cfb\\u9cfc\\u9cfd\\u9cfe\\u9cff\\u9d00\\u9d01\\u9d02\\u9d03\\u9d04\\u9d05\\u9d06\\u9d07\\u9d08\\u9d09\\u9d0a\\u9d0b\\u9d0c\\u9d0d\\u9d0e\\u9d0f\\u9d10\\u9d11\\u9d12\\u9d13\\u9d14\\u9d15\\u9d16\\u9d17\\u9d18\\u9d19\\u9d1a\\u9d1b\\u9d1c\\u9d1d\\u9d1e\\u9d1f\\u9d20\\u9d21\\u9d22\\u9d23\\u9d24\\u9d25\\u9d26\\u9d27\\u9d28\\u9d29\\u9d2a\\u9d2b\\u9d2c\\u9d2d\\u9d2e\\u9d2f\\u9d30\\u9d31\\u9d32\\u9d33\\u9d34\\u9d35\\u9d36\\u9d37\\u9d38\\u9d39\\u9d3a\\u9d3b\\u9d3c\\u9d3d\\u9d3e\\u9d3f\\u9d40\\u9d41\\u9d42\\u9d43\\u9d44\\u9d45\\u9d46\\u9d47\\u9d48\\u9d49\\u9d4a\\u9d4b\\u9d4c\\u9d4d\\u9d4e\\u9d4f\\u9d50\\u9d51\\u9d52\\u9d53\\u9d54\\u9d55\\u9d56\\u9d57\\u9d58\\u9d59\\u9d5a\\u9d5b\\u9d5c\\u9d5d\\u9d5e\\u9d5f\\u9d60\\u9d61\\u9d62\\u9d63\\u9d64\\u9d65\\u9d66\\u9d67\\u9d68\\u9d69\\u9d6a\\u9d6b\\u9d6c\\u9d6d\\u9d6e\\u9d6f\\u9d70\\u9d71\\u9d72\\u9d73\\u9d74\\u9d75\\u9d76\\u9d77\\u9d78\\u9d79\\u9d7a\\u9d7b\\u9d7c\\u9d7d\\u9d7e\\u9d7f\\u9d80\\u9d81\\u9d82\\u9d83\\u9d84\\u9d85\\u9d86\\u9d87\\u9d88\\u9d89\\u9d8a\\u9d8b\\u9d8c\\u9d8d\\u9d8e\\u9d8f\\u9d90\\u9d91\\u9d92\\u9d93\\u9d94\\u9d95\\u9d96\\u9d97\\u9d98\\u9d99\\u9d9a\\u9d9b\\u9d9c\\u9d9d\\u9d9e\\u9d9f\\u9da0\\u9da1\\u9da2\\u9da3\\u9da4\\u9da5\\u9da6\\u9da7\\u9da8\\u9da9\\u9daa\\u9dab\\u9dac\\u9dad\\u9dae\\u9daf\\u9db0\\u9db1\\u9db2\\u9db3\\u9db4\\u9db5\\u9db6\\u9db7\\u9db8\\u9db9\\u9dba\\u9dbb\\u9dbc\\u9dbd\\u9dbe\\u9dbf\\u9dc0\\u9dc1\\u9dc2\\u9dc3\\u9dc4\\u9dc5\\u9dc6\\u9dc7\\u9dc8\\u9dc9\\u9dca\\u9dcb\\u9dcc\\u9dcd\\u9dce\\u9dcf\\u9dd0\\u9dd1\\u9dd2\\u9dd3\\u9dd4\\u9dd5\\u9dd6\\u9dd7\\u9dd8\\u9dd9\\u9dda\\u9ddb\\u9ddc\\u9ddd\\u9dde\\u9ddf\\u9de0\\u9de1\\u9de2\\u9de3\\u9de4\\u9de5\\u9de6\\u9de7\\u9de8\\u9de9\\u9dea\\u9deb\\u9dec\\u9ded\\u9dee\\u9def\\u9df0\\u9df1\\u9df2\\u9df3\\u9df4\\u9df5\\u9df6\\u9df7\\u9df8\\u9df9\\u9dfa\\u9dfb\\u9dfc\\u9dfd\\u9dfe\\u9dff\\u9e00\\u9e01\\u9e02\\u9e03\\u9e04\\u9e05\\u9e06\\u9e07\\u9e08\\u9e09\\u9e0a\\u9e0b\\u9e0c\\u9e0d\\u9e0e\\u9e0f\\u9e10\\u9e11\\u9e12\\u9e13\\u9e14\\u9e15\\u9e16\\u9e17\\u9e18\\u9e19\\u9e1a\\u9e1b\\u9e1c\\u9e1d\\u9e1e\\u9e1f\\u9e20\\u9e21\\u9e22\\u9e23\\u9e24\\u9e25\\u9e26\\u9e27\\u9e28\\u9e29\\u9e2a\\u9e2b\\u9e2c\\u9e2d\\u9e2e\\u9e2f\\u9e30\\u9e31\\u9e32\\u9e33\\u9e34\\u9e35\\u9e36\\u9e37\\u9e38\\u9e39\\u9e3a\\u9e3b\\u9e3c\\u9e3d\\u9e3e\\u9e3f\\u9e40\\u9e41\\u9e42\\u9e43\\u9e44\\u9e45\\u9e46\\u9e47\\u9e48\\u9e49\\u9e4a\\u9e4b\\u9e4c\\u9e4d\\u9e4e\\u9e4f\\u9e50\\u9e51\\u9e52\\u9e53\\u9e54\\u9e55\\u9e56\\u9e57\\u9e58\\u9e59\\u9e5a\\u9e5b\\u9e5c\\u9e5d\\u9e5e\\u9e5f\\u9e60\\u9e61\\u9e62\\u9e63\\u9e64\\u9e65\\u9e66\\u9e67\\u9e68\\u9e69\\u9e6a\\u9e6b\\u9e6c\\u9e6d\\u9e6e\\u9e6f\\u9e70\\u9e71\\u9e72\\u9e73\\u9e74\\u9e75\\u9e76\\u9e77\\u9e78\\u9e79\\u9e7a\\u9e7b\\u9e7c\\u9e7d\\u9e7e\\u9e7f\\u9e80\\u9e81\\u9e82\\u9e83\\u9e84\\u9e85\\u9e86\\u9e87\\u9e88\\u9e89\\u9e8a\\u9e8b\\u9e8c\\u9e8d\\u9e8e\\u9e8f\\u9e90\\u9e91\\u9e92\\u9e93\\u9e94\\u9e95\\u9e96\\u9e97\\u9e98\\u9e99\\u9e9a\\u9e9b\\u9e9c\\u9e9d\\u9e9e\\u9e9f\\u9ea0\\u9ea1\\u9ea2\\u9ea3\\u9ea4\\u9ea5\\u9ea6\\u9ea7\\u9ea8\\u9ea9\\u9eaa\\u9eab\\u9eac\\u9ead\\u9eae\\u9eaf\\u9eb0\\u9eb1\\u9eb2\\u9eb3\\u9eb4\\u9eb5\\u9eb6\\u9eb7\\u9eb8\\u9eb9\\u9eba\\u9ebb\\u9ebc\\u9ebd\\u9ebe\\u9ebf\\u9ec0\\u9ec1\\u9ec2\\u9ec3\\u9ec4\\u9ec5\\u9ec6\\u9ec7\\u9ec8\\u9ec9\\u9eca\\u9ecb\\u9ecc\\u9ecd\\u9ece\\u9ecf\\u9ed0\\u9ed1\\u9ed2\\u9ed3\\u9ed4\\u9ed5\\u9ed6\\u9ed7\\u9ed8\\u9ed9\\u9eda\\u9edb\\u9edc\\u9edd\\u9ede\\u9edf\\u9ee0\\u9ee1\\u9ee2\\u9ee3\\u9ee4\\u9ee5\\u9ee6\\u9ee7\\u9ee8\\u9ee9\\u9eea\\u9eeb\\u9eec\\u9eed\\u9eee\\u9eef\\u9ef0\\u9ef1\\u9ef2\\u9ef3\\u9ef4\\u9ef5\\u9ef6\\u9ef7\\u9ef8\\u9ef9\\u9efa\\u9efb\\u9efc\\u9efd\\u9efe\\u9eff\\u9f00\\u9f01\\u9f02\\u9f03\\u9f04\\u9f05\\u9f06\\u9f07\\u9f08\\u9f09\\u9f0a\\u9f0b\\u9f0c\\u9f0d\\u9f0e\\u9f0f\\u9f10\\u9f11\\u9f12\\u9f13\\u9f14\\u9f15\\u9f16\\u9f17\\u9f18\\u9f19\\u9f1a\\u9f1b\\u9f1c\\u9f1d\\u9f1e\\u9f1f\\u9f20\\u9f21\\u9f22\\u9f23\\u9f24\\u9f25\\u9f26\\u9f27\\u9f28\\u9f29\\u9f2a\\u9f2b\\u9f2c\\u9f2d\\u9f2e\\u9f2f\\u9f30\\u9f31\\u9f32\\u9f33\\u9f34\\u9f35\\u9f36\\u9f37\\u9f38\\u9f39\\u9f3a\\u9f3b\\u9f3c\\u9f3d\\u9f3e\\u9f3f\\u9f40\\u9f41\\u9f42\\u9f43\\u9f44\\u9f45\\u9f46\\u9f47\\u9f48\\u9f49\\u9f4a\\u9f4b\\u9f4c\\u9f4d\\u9f4e\\u9f4f\\u9f50\\u9f51\\u9f52\\u9f53\\u9f54\\u9f55\\u9f56\\u9f57\\u9f58\\u9f59\\u9f5a\\u9f5b\\u9f5c\\u9f5d\\u9f5e\\u9f5f\\u9f60\\u9f61\\u9f62\\u9f63\\u9f64\\u9f65\\u9f66\\u9f67\\u9f68\\u9f69\\u9f6a\\u9f6b\\u9f6c\\u9f6d\\u9f6e\\u9f6f\\u9f70\\u9f71\\u9f72\\u9f73\\u9f74\\u9f75\\u9f76\\u9f77\\u9f78\\u9f79\\u9f7a\\u9f7b\\u9f7c\\u9f7d\\u9f7e\\u9f7f\\u9f80\\u9f81\\u9f82\\u9f83\\u9f84\\u9f85\\u9f86\\u9f87\\u9f88\\u9f89\\u9f8a\\u9f8b\\u9f8c\\u9f8d\\u9f8e\\u9f8f\\u9f90\\u9f91\\u9f92\\u9f93\\u9f94\\u9f95\\u9f96\\u9f97\\u9f98\\u9f99\\u9f9a\\u9f9b\\u9f9c\\u9f9d\\u9f9e\\u9f9f\\u9fa0\\u9fa1\\u9fa2\\u9fa3\\u9fa4\\u9fa5\\u9fa6\\u9fa7\\u9fa8\\u9fa9\\u9faa\\u9fab\\u9fac\\u9fad\\u9fae\\u9faf\\u9fb0\\u9fb1\\u9fb2\\u9fb3\\u9fb4\\u9fb5\\u9fb6\\u9fb7\\u9fb8\\u9fb9\\u9fba\\u9fbb\\ua000\\ua001\\ua002\\ua003\\ua004\\ua005\\ua006\\ua007\\ua008\\ua009\\ua00a\\ua00b\\ua00c\\ua00d\\ua00e\\ua00f\\ua010\\ua011\\ua012\\ua013\\ua014\\ua016\\ua017\\ua018\\ua019\\ua01a\\ua01b\\ua01c\\ua01d\\ua01e\\ua01f\\ua020\\ua021\\ua022\\ua023\\ua024\\ua025\\ua026\\ua027\\ua028\\ua029\\ua02a\\ua02b\\ua02c\\ua02d\\ua02e\\ua02f\\ua030\\ua031\\ua032\\ua033\\ua034\\ua035\\ua036\\ua037\\ua038\\ua039\\ua03a\\ua03b\\ua03c\\ua03d\\ua03e\\ua03f\\ua040\\ua041\\ua042\\ua043\\ua044\\ua045\\ua046\\ua047\\ua048\\ua049\\ua04a\\ua04b\\ua04c\\ua04d\\ua04e\\ua04f\\ua050\\ua051\\ua052\\ua053\\ua054\\ua055\\ua056\\ua057\\ua058\\ua059\\ua05a\\ua05b\\ua05c\\ua05d\\ua05e\\ua05f\\ua060\\ua061\\ua062\\ua063\\ua064\\ua065\\ua066\\ua067\\ua068\\ua069\\ua06a\\ua06b\\ua06c\\ua06d\\ua06e\\ua06f\\ua070\\ua071\\ua072\\ua073\\ua074\\ua075\\ua076\\ua077\\ua078\\ua079\\ua07a\\ua07b\\ua07c\\ua07d\\ua07e\\ua07f\\ua080\\ua081\\ua082\\ua083\\ua084\\ua085\\ua086\\ua087\\ua088\\ua089\\ua08a\\ua08b\\ua08c\\ua08d\\ua08e\\ua08f\\ua090\\ua091\\ua092\\ua093\\ua094\\ua095\\ua096\\ua097\\ua098\\ua099\\ua09a\\ua09b\\ua09c\\ua09d\\ua09e\\ua09f\\ua0a0\\ua0a1\\ua0a2\\ua0a3\\ua0a4\\ua0a5\\ua0a6\\ua0a7\\ua0a8\\ua0a9\\ua0aa\\ua0ab\\ua0ac\\ua0ad\\ua0ae\\ua0af\\ua0b0\\ua0b1\\ua0b2\\ua0b3\\ua0b4\\ua0b5\\ua0b6\\ua0b7\\ua0b8\\ua0b9\\ua0ba\\ua0bb\\ua0bc\\ua0bd\\ua0be\\ua0bf\\ua0c0\\ua0c1\\ua0c2\\ua0c3\\ua0c4\\ua0c5\\ua0c6\\ua0c7\\ua0c8\\ua0c9\\ua0ca\\ua0cb\\ua0cc\\ua0cd\\ua0ce\\ua0cf\\ua0d0\\ua0d1\\ua0d2\\ua0d3\\ua0d4\\ua0d5\\ua0d6\\ua0d7\\ua0d8\\ua0d9\\ua0da\\ua0db\\ua0dc\\ua0dd\\ua0de\\ua0df\\ua0e0\\ua0e1\\ua0e2\\ua0e3\\ua0e4\\ua0e5\\ua0e6\\ua0e7\\ua0e8\\ua0e9\\ua0ea\\ua0eb\\ua0ec\\ua0ed\\ua0ee\\ua0ef\\ua0f0\\ua0f1\\ua0f2\\ua0f3\\ua0f4\\ua0f5\\ua0f6\\ua0f7\\ua0f8\\ua0f9\\ua0fa\\ua0fb\\ua0fc\\ua0fd\\ua0fe\\ua0ff\\ua100\\ua101\\ua102\\ua103\\ua104\\ua105\\ua106\\ua107\\ua108\\ua109\\ua10a\\ua10b\\ua10c\\ua10d\\ua10e\\ua10f\\ua110\\ua111\\ua112\\ua113\\ua114\\ua115\\ua116\\ua117\\ua118\\ua119\\ua11a\\ua11b\\ua11c\\ua11d\\ua11e\\ua11f\\ua120\\ua121\\ua122\\ua123\\ua124\\ua125\\ua126\\ua127\\ua128\\ua129\\ua12a\\ua12b\\ua12c\\ua12d\\ua12e\\ua12f\\ua130\\ua131\\ua132\\ua133\\ua134\\ua135\\ua136\\ua137\\ua138\\ua139\\ua13a\\ua13b\\ua13c\\ua13d\\ua13e\\ua13f\\ua140\\ua141\\ua142\\ua143\\ua144\\ua145\\ua146\\ua147\\ua148\\ua149\\ua14a\\ua14b\\ua14c\\ua14d\\ua14e\\ua14f\\ua150\\ua151\\ua152\\ua153\\ua154\\ua155\\ua156\\ua157\\ua158\\ua159\\ua15a\\ua15b\\ua15c\\ua15d\\ua15e\\ua15f\\ua160\\ua161\\ua162\\ua163\\ua164\\ua165\\ua166\\ua167\\ua168\\ua169\\ua16a\\ua16b\\ua16c\\ua16d\\ua16e\\ua16f\\ua170\\ua171\\ua172\\ua173\\ua174\\ua175\\ua176\\ua177\\ua178\\ua179\\ua17a\\ua17b\\ua17c\\ua17d\\ua17e\\ua17f\\ua180\\ua181\\ua182\\ua183\\ua184\\ua185\\ua186\\ua187\\ua188\\ua189\\ua18a\\ua18b\\ua18c\\ua18d\\ua18e\\ua18f\\ua190\\ua191\\ua192\\ua193\\ua194\\ua195\\ua196\\ua197\\ua198\\ua199\\ua19a\\ua19b\\ua19c\\ua19d\\ua19e\\ua19f\\ua1a0\\ua1a1\\ua1a2\\ua1a3\\ua1a4\\ua1a5\\ua1a6\\ua1a7\\ua1a8\\ua1a9\\ua1aa\\ua1ab\\ua1ac\\ua1ad\\ua1ae\\ua1af\\ua1b0\\ua1b1\\ua1b2\\ua1b3\\ua1b4\\ua1b5\\ua1b6\\ua1b7\\ua1b8\\ua1b9\\ua1ba\\ua1bb\\ua1bc\\ua1bd\\ua1be\\ua1bf\\ua1c0\\ua1c1\\ua1c2\\ua1c3\\ua1c4\\ua1c5\\ua1c6\\ua1c7\\ua1c8\\ua1c9\\ua1ca\\ua1cb\\ua1cc\\ua1cd\\ua1ce\\ua1cf\\ua1d0\\ua1d1\\ua1d2\\ua1d3\\ua1d4\\ua1d5\\ua1d6\\ua1d7\\ua1d8\\ua1d9\\ua1da\\ua1db\\ua1dc\\ua1dd\\ua1de\\ua1df\\ua1e0\\ua1e1\\ua1e2\\ua1e3\\ua1e4\\ua1e5\\ua1e6\\ua1e7\\ua1e8\\ua1e9\\ua1ea\\ua1eb\\ua1ec\\ua1ed\\ua1ee\\ua1ef\\ua1f0\\ua1f1\\ua1f2\\ua1f3\\ua1f4\\ua1f5\\ua1f6\\ua1f7\\ua1f8\\ua1f9\\ua1fa\\ua1fb\\ua1fc\\ua1fd\\ua1fe\\ua1ff\\ua200\\ua201\\ua202\\ua203\\ua204\\ua205\\ua206\\ua207\\ua208\\ua209\\ua20a\\ua20b\\ua20c\\ua20d\\ua20e\\ua20f\\ua210\\ua211\\ua212\\ua213\\ua214\\ua215\\ua216\\ua217\\ua218\\ua219\\ua21a\\ua21b\\ua21c\\ua21d\\ua21e\\ua21f\\ua220\\ua221\\ua222\\ua223\\ua224\\ua225\\ua226\\ua227\\ua228\\ua229\\ua22a\\ua22b\\ua22c\\ua22d\\ua22e\\ua22f\\ua230\\ua231\\ua232\\ua233\\ua234\\ua235\\ua236\\ua237\\ua238\\ua239\\ua23a\\ua23b\\ua23c\\ua23d\\ua23e\\ua23f\\ua240\\ua241\\ua242\\ua243\\ua244\\ua245\\ua246\\ua247\\ua248\\ua249\\ua24a\\ua24b\\ua24c\\ua24d\\ua24e\\ua24f\\ua250\\ua251\\ua252\\ua253\\ua254\\ua255\\ua256\\ua257\\ua258\\ua259\\ua25a\\ua25b\\ua25c\\ua25d\\ua25e\\ua25f\\ua260\\ua261\\ua262\\ua263\\ua264\\ua265\\ua266\\ua267\\ua268\\ua269\\ua26a\\ua26b\\ua26c\\ua26d\\ua26e\\ua26f\\ua270\\ua271\\ua272\\ua273\\ua274\\ua275\\ua276\\ua277\\ua278\\ua279\\ua27a\\ua27b\\ua27c\\ua27d\\ua27e\\ua27f\\ua280\\ua281\\ua282\\ua283\\ua284\\ua285\\ua286\\ua287\\ua288\\ua289\\ua28a\\ua28b\\ua28c\\ua28d\\ua28e\\ua28f\\ua290\\ua291\\ua292\\ua293\\ua294\\ua295\\ua296\\ua297\\ua298\\ua299\\ua29a\\ua29b\\ua29c\\ua29d\\ua29e\\ua29f\\ua2a0\\ua2a1\\ua2a2\\ua2a3\\ua2a4\\ua2a5\\ua2a6\\ua2a7\\ua2a8\\ua2a9\\ua2aa\\ua2ab\\ua2ac\\ua2ad\\ua2ae\\ua2af\\ua2b0\\ua2b1\\ua2b2\\ua2b3\\ua2b4\\ua2b5\\ua2b6\\ua2b7\\ua2b8\\ua2b9\\ua2ba\\ua2bb\\ua2bc\\ua2bd\\ua2be\\ua2bf\\ua2c0\\ua2c1\\ua2c2\\ua2c3\\ua2c4\\ua2c5\\ua2c6\\ua2c7\\ua2c8\\ua2c9\\ua2ca\\ua2cb\\ua2cc\\ua2cd\\ua2ce\\ua2cf\\ua2d0\\ua2d1\\ua2d2\\ua2d3\\ua2d4\\ua2d5\\ua2d6\\ua2d7\\ua2d8\\ua2d9\\ua2da\\ua2db\\ua2dc\\ua2dd\\ua2de\\ua2df\\ua2e0\\ua2e1\\ua2e2\\ua2e3\\ua2e4\\ua2e5\\ua2e6\\ua2e7\\ua2e8\\ua2e9\\ua2ea\\ua2eb\\ua2ec\\ua2ed\\ua2ee\\ua2ef\\ua2f0\\ua2f1\\ua2f2\\ua2f3\\ua2f4\\ua2f5\\ua2f6\\ua2f7\\ua2f8\\ua2f9\\ua2fa\\ua2fb\\ua2fc\\ua2fd\\ua2fe\\ua2ff\\ua300\\ua301\\ua302\\ua303\\ua304\\ua305\\ua306\\ua307\\ua308\\ua309\\ua30a\\ua30b\\ua30c\\ua30d\\ua30e\\ua30f\\ua310\\ua311\\ua312\\ua313\\ua314\\ua315\\ua316\\ua317\\ua318\\ua319\\ua31a\\ua31b\\ua31c\\ua31d\\ua31e\\ua31f\\ua320\\ua321\\ua322\\ua323\\ua324\\ua325\\ua326\\ua327\\ua328\\ua329\\ua32a\\ua32b\\ua32c\\ua32d\\ua32e\\ua32f\\ua330\\ua331\\ua332\\ua333\\ua334\\ua335\\ua336\\ua337\\ua338\\ua339\\ua33a\\ua33b\\ua33c\\ua33d\\ua33e\\ua33f\\ua340\\ua341\\ua342\\ua343\\ua344\\ua345\\ua346\\ua347\\ua348\\ua349\\ua34a\\ua34b\\ua34c\\ua34d\\ua34e\\ua34f\\ua350\\ua351\\ua352\\ua353\\ua354\\ua355\\ua356\\ua357\\ua358\\ua359\\ua35a\\ua35b\\ua35c\\ua35d\\ua35e\\ua35f\\ua360\\ua361\\ua362\\ua363\\ua364\\ua365\\ua366\\ua367\\ua368\\ua369\\ua36a\\ua36b\\ua36c\\ua36d\\ua36e\\ua36f\\ua370\\ua371\\ua372\\ua373\\ua374\\ua375\\ua376\\ua377\\ua378\\ua379\\ua37a\\ua37b\\ua37c\\ua37d\\ua37e\\ua37f\\ua380\\ua381\\ua382\\ua383\\ua384\\ua385\\ua386\\ua387\\ua388\\ua389\\ua38a\\ua38b\\ua38c\\ua38d\\ua38e\\ua38f\\ua390\\ua391\\ua392\\ua393\\ua394\\ua395\\ua396\\ua397\\ua398\\ua399\\ua39a\\ua39b\\ua39c\\ua39d\\ua39e\\ua39f\\ua3a0\\ua3a1\\ua3a2\\ua3a3\\ua3a4\\ua3a5\\ua3a6\\ua3a7\\ua3a8\\ua3a9\\ua3aa\\ua3ab\\ua3ac\\ua3ad\\ua3ae\\ua3af\\ua3b0\\ua3b1\\ua3b2\\ua3b3\\ua3b4\\ua3b5\\ua3b6\\ua3b7\\ua3b8\\ua3b9\\ua3ba\\ua3bb\\ua3bc\\ua3bd\\ua3be\\ua3bf\\ua3c0\\ua3c1\\ua3c2\\ua3c3\\ua3c4\\ua3c5\\ua3c6\\ua3c7\\ua3c8\\ua3c9\\ua3ca\\ua3cb\\ua3cc\\ua3cd\\ua3ce\\ua3cf\\ua3d0\\ua3d1\\ua3d2\\ua3d3\\ua3d4\\ua3d5\\ua3d6\\ua3d7\\ua3d8\\ua3d9\\ua3da\\ua3db\\ua3dc\\ua3dd\\ua3de\\ua3df\\ua3e0\\ua3e1\\ua3e2\\ua3e3\\ua3e4\\ua3e5\\ua3e6\\ua3e7\\ua3e8\\ua3e9\\ua3ea\\ua3eb\\ua3ec\\ua3ed\\ua3ee\\ua3ef\\ua3f0\\ua3f1\\ua3f2\\ua3f3\\ua3f4\\ua3f5\\ua3f6\\ua3f7\\ua3f8\\ua3f9\\ua3fa\\ua3fb\\ua3fc\\ua3fd\\ua3fe\\ua3ff\\ua400\\ua401\\ua402\\ua403\\ua404\\ua405\\ua406\\ua407\\ua408\\ua409\\ua40a\\ua40b\\ua40c\\ua40d\\ua40e\\ua40f\\ua410\\ua411\\ua412\\ua413\\ua414\\ua415\\ua416\\ua417\\ua418\\ua419\\ua41a\\ua41b\\ua41c\\ua41d\\ua41e\\ua41f\\ua420\\ua421\\ua422\\ua423\\ua424\\ua425\\ua426\\ua427\\ua428\\ua429\\ua42a\\ua42b\\ua42c\\ua42d\\ua42e\\ua42f\\ua430\\ua431\\ua432\\ua433\\ua434\\ua435\\ua436\\ua437\\ua438\\ua439\\ua43a\\ua43b\\ua43c\\ua43d\\ua43e\\ua43f\\ua440\\ua441\\ua442\\ua443\\ua444\\ua445\\ua446\\ua447\\ua448\\ua449\\ua44a\\ua44b\\ua44c\\ua44d\\ua44e\\ua44f\\ua450\\ua451\\ua452\\ua453\\ua454\\ua455\\ua456\\ua457\\ua458\\ua459\\ua45a\\ua45b\\ua45c\\ua45d\\ua45e\\ua45f\\ua460\\ua461\\ua462\\ua463\\ua464\\ua465\\ua466\\ua467\\ua468\\ua469\\ua46a\\ua46b\\ua46c\\ua46d\\ua46e\\ua46f\\ua470\\ua471\\ua472\\ua473\\ua474\\ua475\\ua476\\ua477\\ua478\\ua479\\ua47a\\ua47b\\ua47c\\ua47d\\ua47e\\ua47f\\ua480\\ua481\\ua482\\ua483\\ua484\\ua485\\ua486\\ua487\\ua488\\ua489\\ua48a\\ua48b\\ua48c\\ua800\\ua801\\ua803\\ua804\\ua805\\ua807\\ua808\\ua809\\ua80a\\ua80c\\ua80d\\ua80e\\ua80f\\ua810\\ua811\\ua812\\ua813\\ua814\\ua815\\ua816\\ua817\\ua818\\ua819\\ua81a\\ua81b\\ua81c\\ua81d\\ua81e\\ua81f\\ua820\\ua821\\ua822\\uac00\\uac01\\uac02\\uac03\\uac04\\uac05\\uac06\\uac07\\uac08\\uac09\\uac0a\\uac0b\\uac0c\\uac0d\\uac0e\\uac0f\\uac10\\uac11\\uac12\\uac13\\uac14\\uac15\\uac16\\uac17\\uac18\\uac19\\uac1a\\uac1b\\uac1c\\uac1d\\uac1e\\uac1f\\uac20\\uac21\\uac22\\uac23\\uac24\\uac25\\uac26\\uac27\\uac28\\uac29\\uac2a\\uac2b\\uac2c\\uac2d\\uac2e\\uac2f\\uac30\\uac31\\uac32\\uac33\\uac34\\uac35\\uac36\\uac37\\uac38\\uac39\\uac3a\\uac3b\\uac3c\\uac3d\\uac3e\\uac3f\\uac40\\uac41\\uac42\\uac43\\uac44\\uac45\\uac46\\uac47\\uac48\\uac49\\uac4a\\uac4b\\uac4c\\uac4d\\uac4e\\uac4f\\uac50\\uac51\\uac52\\uac53\\uac54\\uac55\\uac56\\uac57\\uac58\\uac59\\uac5a\\uac5b\\uac5c\\uac5d\\uac5e\\uac5f\\uac60\\uac61\\uac62\\uac63\\uac64\\uac65\\uac66\\uac67\\uac68\\uac69\\uac6a\\uac6b\\uac6c\\uac6d\\uac6e\\uac6f\\uac70\\uac71\\uac72\\uac73\\uac74\\uac75\\uac76\\uac77\\uac78\\uac79\\uac7a\\uac7b\\uac7c\\uac7d\\uac7e\\uac7f\\uac80\\uac81\\uac82\\uac83\\uac84\\uac85\\uac86\\uac87\\uac88\\uac89\\uac8a\\uac8b\\uac8c\\uac8d\\uac8e\\uac8f\\uac90\\uac91\\uac92\\uac93\\uac94\\uac95\\uac96\\uac97\\uac98\\uac99\\uac9a\\uac9b\\uac9c\\uac9d\\uac9e\\uac9f\\uaca0\\uaca1\\uaca2\\uaca3\\uaca4\\uaca5\\uaca6\\uaca7\\uaca8\\uaca9\\uacaa\\uacab\\uacac\\uacad\\uacae\\uacaf\\uacb0\\uacb1\\uacb2\\uacb3\\uacb4\\uacb5\\uacb6\\uacb7\\uacb8\\uacb9\\uacba\\uacbb\\uacbc\\uacbd\\uacbe\\uacbf\\uacc0\\uacc1\\uacc2\\uacc3\\uacc4\\uacc5\\uacc6\\uacc7\\uacc8\\uacc9\\uacca\\uaccb\\uaccc\\uaccd\\uacce\\uaccf\\uacd0\\uacd1\\uacd2\\uacd3\\uacd4\\uacd5\\uacd6\\uacd7\\uacd8\\uacd9\\uacda\\uacdb\\uacdc\\uacdd\\uacde\\uacdf\\uace0\\uace1\\uace2\\uace3\\uace4\\uace5\\uace6\\uace7\\uace8\\uace9\\uacea\\uaceb\\uacec\\uaced\\uacee\\uacef\\uacf0\\uacf1\\uacf2\\uacf3\\uacf4\\uacf5\\uacf6\\uacf7\\uacf8\\uacf9\\uacfa\\uacfb\\uacfc\\uacfd\\uacfe\\uacff\\uad00\\uad01\\uad02\\uad03\\uad04\\uad05\\uad06\\uad07\\uad08\\uad09\\uad0a\\uad0b\\uad0c\\uad0d\\uad0e\\uad0f\\uad10\\uad11\\uad12\\uad13\\uad14\\uad15\\uad16\\uad17\\uad18\\uad19\\uad1a\\uad1b\\uad1c\\uad1d\\uad1e\\uad1f\\uad20\\uad21\\uad22\\uad23\\uad24\\uad25\\uad26\\uad27\\uad28\\uad29\\uad2a\\uad2b\\uad2c\\uad2d\\uad2e\\uad2f\\uad30\\uad31\\uad32\\uad33\\uad34\\uad35\\uad36\\uad37\\uad38\\uad39\\uad3a\\uad3b\\uad3c\\uad3d\\uad3e\\uad3f\\uad40\\uad41\\uad42\\uad43\\uad44\\uad45\\uad46\\uad47\\uad48\\uad49\\uad4a\\uad4b\\uad4c\\uad4d\\uad4e\\uad4f\\uad50\\uad51\\uad52\\uad53\\uad54\\uad55\\uad56\\uad57\\uad58\\uad59\\uad5a\\uad5b\\uad5c\\uad5d\\uad5e\\uad5f\\uad60\\uad61\\uad62\\uad63\\uad64\\uad65\\uad66\\uad67\\uad68\\uad69\\uad6a\\uad6b\\uad6c\\uad6d\\uad6e\\uad6f\\uad70\\uad71\\uad72\\uad73\\uad74\\uad75\\uad76\\uad77\\uad78\\uad79\\uad7a\\uad7b\\uad7c\\uad7d\\uad7e\\uad7f\\uad80\\uad81\\uad82\\uad83\\uad84\\uad85\\uad86\\uad87\\uad88\\uad89\\uad8a\\uad8b\\uad8c\\uad8d\\uad8e\\uad8f\\uad90\\uad91\\uad92\\uad93\\uad94\\uad95\\uad96\\uad97\\uad98\\uad99\\uad9a\\uad9b\\uad9c\\uad9d\\uad9e\\uad9f\\uada0\\uada1\\uada2\\uada3\\uada4\\uada5\\uada6\\uada7\\uada8\\uada9\\uadaa\\uadab\\uadac\\uadad\\uadae\\uadaf\\uadb0\\uadb1\\uadb2\\uadb3\\uadb4\\uadb5\\uadb6\\uadb7\\uadb8\\uadb9\\uadba\\uadbb\\uadbc\\uadbd\\uadbe\\uadbf\\uadc0\\uadc1\\uadc2\\uadc3\\uadc4\\uadc5\\uadc6\\uadc7\\uadc8\\uadc9\\uadca\\uadcb\\uadcc\\uadcd\\uadce\\uadcf\\uadd0\\uadd1\\uadd2\\uadd3\\uadd4\\uadd5\\uadd6\\uadd7\\uadd8\\uadd9\\uadda\\uaddb\\uaddc\\uaddd\\uadde\\uaddf\\uade0\\uade1\\uade2\\uade3\\uade4\\uade5\\uade6\\uade7\\uade8\\uade9\\uadea\\uadeb\\uadec\\uaded\\uadee\\uadef\\uadf0\\uadf1\\uadf2\\uadf3\\uadf4\\uadf5\\uadf6\\uadf7\\uadf8\\uadf9\\uadfa\\uadfb\\uadfc\\uadfd\\uadfe\\uadff\\uae00\\uae01\\uae02\\uae03\\uae04\\uae05\\uae06\\uae07\\uae08\\uae09\\uae0a\\uae0b\\uae0c\\uae0d\\uae0e\\uae0f\\uae10\\uae11\\uae12\\uae13\\uae14\\uae15\\uae16\\uae17\\uae18\\uae19\\uae1a\\uae1b\\uae1c\\uae1d\\uae1e\\uae1f\\uae20\\uae21\\uae22\\uae23\\uae24\\uae25\\uae26\\uae27\\uae28\\uae29\\uae2a\\uae2b\\uae2c\\uae2d\\uae2e\\uae2f\\uae30\\uae31\\uae32\\uae33\\uae34\\uae35\\uae36\\uae37\\uae38\\uae39\\uae3a\\uae3b\\uae3c\\uae3d\\uae3e\\uae3f\\uae40\\uae41\\uae42\\uae43\\uae44\\uae45\\uae46\\uae47\\uae48\\uae49\\uae4a\\uae4b\\uae4c\\uae4d\\uae4e\\uae4f\\uae50\\uae51\\uae52\\uae53\\uae54\\uae55\\uae56\\uae57\\uae58\\uae59\\uae5a\\uae5b\\uae5c\\uae5d\\uae5e\\uae5f\\uae60\\uae61\\uae62\\uae63\\uae64\\uae65\\uae66\\uae67\\uae68\\uae69\\uae6a\\uae6b\\uae6c\\uae6d\\uae6e\\uae6f\\uae70\\uae71\\uae72\\uae73\\uae74\\uae75\\uae76\\uae77\\uae78\\uae79\\uae7a\\uae7b\\uae7c\\uae7d\\uae7e\\uae7f\\uae80\\uae81\\uae82\\uae83\\uae84\\uae85\\uae86\\uae87\\uae88\\uae89\\uae8a\\uae8b\\uae8c\\uae8d\\uae8e\\uae8f\\uae90\\uae91\\uae92\\uae93\\uae94\\uae95\\uae96\\uae97\\uae98\\uae99\\uae9a\\uae9b\\uae9c\\uae9d\\uae9e\\uae9f\\uaea0\\uaea1\\uaea2\\uaea3\\uaea4\\uaea5\\uaea6\\uaea7\\uaea8\\uaea9\\uaeaa\\uaeab\\uaeac\\uaead\\uaeae\\uaeaf\\uaeb0\\uaeb1\\uaeb2\\uaeb3\\uaeb4\\uaeb5\\uaeb6\\uaeb7\\uaeb8\\uaeb9\\uaeba\\uaebb\\uaebc\\uaebd\\uaebe\\uaebf\\uaec0\\uaec1\\uaec2\\uaec3\\uaec4\\uaec5\\uaec6\\uaec7\\uaec8\\uaec9\\uaeca\\uaecb\\uaecc\\uaecd\\uaece\\uaecf\\uaed0\\uaed1\\uaed2\\uaed3\\uaed4\\uaed5\\uaed6\\uaed7\\uaed8\\uaed9\\uaeda\\uaedb\\uaedc\\uaedd\\uaede\\uaedf\\uaee0\\uaee1\\uaee2\\uaee3\\uaee4\\uaee5\\uaee6\\uaee7\\uaee8\\uaee9\\uaeea\\uaeeb\\uaeec\\uaeed\\uaeee\\uaeef\\uaef0\\uaef1\\uaef2\\uaef3\\uaef4\\uaef5\\uaef6\\uaef7\\uaef8\\uaef9\\uaefa\\uaefb\\uaefc\\uaefd\\uaefe\\uaeff\\uaf00\\uaf01\\uaf02\\uaf03\\uaf04\\uaf05\\uaf06\\uaf07\\uaf08\\uaf09\\uaf0a\\uaf0b\\uaf0c\\uaf0d\\uaf0e\\uaf0f\\uaf10\\uaf11\\uaf12\\uaf13\\uaf14\\uaf15\\uaf16\\uaf17\\uaf18\\uaf19\\uaf1a\\uaf1b\\uaf1c\\uaf1d\\uaf1e\\uaf1f\\uaf20\\uaf21\\uaf22\\uaf23\\uaf24\\uaf25\\uaf26\\uaf27\\uaf28\\uaf29\\uaf2a\\uaf2b\\uaf2c\\uaf2d\\uaf2e\\uaf2f\\uaf30\\uaf31\\uaf32\\uaf33\\uaf34\\uaf35\\uaf36\\uaf37\\uaf38\\uaf39\\uaf3a\\uaf3b\\uaf3c\\uaf3d\\uaf3e\\uaf3f\\uaf40\\uaf41\\uaf42\\uaf43\\uaf44\\uaf45\\uaf46\\uaf47\\uaf48\\uaf49\\uaf4a\\uaf4b\\uaf4c\\uaf4d\\uaf4e\\uaf4f\\uaf50\\uaf51\\uaf52\\uaf53\\uaf54\\uaf55\\uaf56\\uaf57\\uaf58\\uaf59\\uaf5a\\uaf5b\\uaf5c\\uaf5d\\uaf5e\\uaf5f\\uaf60\\uaf61\\uaf62\\uaf63\\uaf64\\uaf65\\uaf66\\uaf67\\uaf68\\uaf69\\uaf6a\\uaf6b\\uaf6c\\uaf6d\\uaf6e\\uaf6f\\uaf70\\uaf71\\uaf72\\uaf73\\uaf74\\uaf75\\uaf76\\uaf77\\uaf78\\uaf79\\uaf7a\\uaf7b\\uaf7c\\uaf7d\\uaf7e\\uaf7f\\uaf80\\uaf81\\uaf82\\uaf83\\uaf84\\uaf85\\uaf86\\uaf87\\uaf88\\uaf89\\uaf8a\\uaf8b\\uaf8c\\uaf8d\\uaf8e\\uaf8f\\uaf90\\uaf91\\uaf92\\uaf93\\uaf94\\uaf95\\uaf96\\uaf97\\uaf98\\uaf99\\uaf9a\\uaf9b\\uaf9c\\uaf9d\\uaf9e\\uaf9f\\uafa0\\uafa1\\uafa2\\uafa3\\uafa4\\uafa5\\uafa6\\uafa7\\uafa8\\uafa9\\uafaa\\uafab\\uafac\\uafad\\uafae\\uafaf\\uafb0\\uafb1\\uafb2\\uafb3\\uafb4\\uafb5\\uafb6\\uafb7\\uafb8\\uafb9\\uafba\\uafbb\\uafbc\\uafbd\\uafbe\\uafbf\\uafc0\\uafc1\\uafc2\\uafc3\\uafc4\\uafc5\\uafc6\\uafc7\\uafc8\\uafc9\\uafca\\uafcb\\uafcc\\uafcd\\uafce\\uafcf\\uafd0\\uafd1\\uafd2\\uafd3\\uafd4\\uafd5\\uafd6\\uafd7\\uafd8\\uafd9\\uafda\\uafdb\\uafdc\\uafdd\\uafde\\uafdf\\uafe0\\uafe1\\uafe2\\uafe3\\uafe4\\uafe5\\uafe6\\uafe7\\uafe8\\uafe9\\uafea\\uafeb\\uafec\\uafed\\uafee\\uafef\\uaff0\\uaff1\\uaff2\\uaff3\\uaff4\\uaff5\\uaff6\\uaff7\\uaff8\\uaff9\\uaffa\\uaffb\\uaffc\\uaffd\\uaffe\\uafff\\ub000\\ub001\\ub002\\ub003\\ub004\\ub005\\ub006\\ub007\\ub008\\ub009\\ub00a\\ub00b\\ub00c\\ub00d\\ub00e\\ub00f\\ub010\\ub011\\ub012\\ub013\\ub014\\ub015\\ub016\\ub017\\ub018\\ub019\\ub01a\\ub01b\\ub01c\\ub01d\\ub01e\\ub01f\\ub020\\ub021\\ub022\\ub023\\ub024\\ub025\\ub026\\ub027\\ub028\\ub029\\ub02a\\ub02b\\ub02c\\ub02d\\ub02e\\ub02f\\ub030\\ub031\\ub032\\ub033\\ub034\\ub035\\ub036\\ub037\\ub038\\ub039\\ub03a\\ub03b\\ub03c\\ub03d\\ub03e\\ub03f\\ub040\\ub041\\ub042\\ub043\\ub044\\ub045\\ub046\\ub047\\ub048\\ub049\\ub04a\\ub04b\\ub04c\\ub04d\\ub04e\\ub04f\\ub050\\ub051\\ub052\\ub053\\ub054\\ub055\\ub056\\ub057\\ub058\\ub059\\ub05a\\ub05b\\ub05c\\ub05d\\ub05e\\ub05f\\ub060\\ub061\\ub062\\ub063\\ub064\\ub065\\ub066\\ub067\\ub068\\ub069\\ub06a\\ub06b\\ub06c\\ub06d\\ub06e\\ub06f\\ub070\\ub071\\ub072\\ub073\\ub074\\ub075\\ub076\\ub077\\ub078\\ub079\\ub07a\\ub07b\\ub07c\\ub07d\\ub07e\\ub07f\\ub080\\ub081\\ub082\\ub083\\ub084\\ub085\\ub086\\ub087\\ub088\\ub089\\ub08a\\ub08b\\ub08c\\ub08d\\ub08e\\ub08f\\ub090\\ub091\\ub092\\ub093\\ub094\\ub095\\ub096\\ub097\\ub098\\ub099\\ub09a\\ub09b\\ub09c\\ub09d\\ub09e\\ub09f\\ub0a0\\ub0a1\\ub0a2\\ub0a3\\ub0a4\\ub0a5\\ub0a6\\ub0a7\\ub0a8\\ub0a9\\ub0aa\\ub0ab\\ub0ac\\ub0ad\\ub0ae\\ub0af\\ub0b0\\ub0b1\\ub0b2\\ub0b3\\ub0b4\\ub0b5\\ub0b6\\ub0b7\\ub0b8\\ub0b9\\ub0ba\\ub0bb\\ub0bc\\ub0bd\\ub0be\\ub0bf\\ub0c0\\ub0c1\\ub0c2\\ub0c3\\ub0c4\\ub0c5\\ub0c6\\ub0c7\\ub0c8\\ub0c9\\ub0ca\\ub0cb\\ub0cc\\ub0cd\\ub0ce\\ub0cf\\ub0d0\\ub0d1\\ub0d2\\ub0d3\\ub0d4\\ub0d5\\ub0d6\\ub0d7\\ub0d8\\ub0d9\\ub0da\\ub0db\\ub0dc\\ub0dd\\ub0de\\ub0df\\ub0e0\\ub0e1\\ub0e2\\ub0e3\\ub0e4\\ub0e5\\ub0e6\\ub0e7\\ub0e8\\ub0e9\\ub0ea\\ub0eb\\ub0ec\\ub0ed\\ub0ee\\ub0ef\\ub0f0\\ub0f1\\ub0f2\\ub0f3\\ub0f4\\ub0f5\\ub0f6\\ub0f7\\ub0f8\\ub0f9\\ub0fa\\ub0fb\\ub0fc\\ub0fd\\ub0fe\\ub0ff\\ub100\\ub101\\ub102\\ub103\\ub104\\ub105\\ub106\\ub107\\ub108\\ub109\\ub10a\\ub10b\\ub10c\\ub10d\\ub10e\\ub10f\\ub110\\ub111\\ub112\\ub113\\ub114\\ub115\\ub116\\ub117\\ub118\\ub119\\ub11a\\ub11b\\ub11c\\ub11d\\ub11e\\ub11f\\ub120\\ub121\\ub122\\ub123\\ub124\\ub125\\ub126\\ub127\\ub128\\ub129\\ub12a\\ub12b\\ub12c\\ub12d\\ub12e\\ub12f\\ub130\\ub131\\ub132\\ub133\\ub134\\ub135\\ub136\\ub137\\ub138\\ub139\\ub13a\\ub13b\\ub13c\\ub13d\\ub13e\\ub13f\\ub140\\ub141\\ub142\\ub143\\ub144\\ub145\\ub146\\ub147\\ub148\\ub149\\ub14a\\ub14b\\ub14c\\ub14d\\ub14e\\ub14f\\ub150\\ub151\\ub152\\ub153\\ub154\\ub155\\ub156\\ub157\\ub158\\ub159\\ub15a\\ub15b\\ub15c\\ub15d\\ub15e\\ub15f\\ub160\\ub161\\ub162\\ub163\\ub164\\ub165\\ub166\\ub167\\ub168\\ub169\\ub16a\\ub16b\\ub16c\\ub16d\\ub16e\\ub16f\\ub170\\ub171\\ub172\\ub173\\ub174\\ub175\\ub176\\ub177\\ub178\\ub179\\ub17a\\ub17b\\ub17c\\ub17d\\ub17e\\ub17f\\ub180\\ub181\\ub182\\ub183\\ub184\\ub185\\ub186\\ub187\\ub188\\ub189\\ub18a\\ub18b\\ub18c\\ub18d\\ub18e\\ub18f\\ub190\\ub191\\ub192\\ub193\\ub194\\ub195\\ub196\\ub197\\ub198\\ub199\\ub19a\\ub19b\\ub19c\\ub19d\\ub19e\\ub19f\\ub1a0\\ub1a1\\ub1a2\\ub1a3\\ub1a4\\ub1a5\\ub1a6\\ub1a7\\ub1a8\\ub1a9\\ub1aa\\ub1ab\\ub1ac\\ub1ad\\ub1ae\\ub1af\\ub1b0\\ub1b1\\ub1b2\\ub1b3\\ub1b4\\ub1b5\\ub1b6\\ub1b7\\ub1b8\\ub1b9\\ub1ba\\ub1bb\\ub1bc\\ub1bd\\ub1be\\ub1bf\\ub1c0\\ub1c1\\ub1c2\\ub1c3\\ub1c4\\ub1c5\\ub1c6\\ub1c7\\ub1c8\\ub1c9\\ub1ca\\ub1cb\\ub1cc\\ub1cd\\ub1ce\\ub1cf\\ub1d0\\ub1d1\\ub1d2\\ub1d3\\ub1d4\\ub1d5\\ub1d6\\ub1d7\\ub1d8\\ub1d9\\ub1da\\ub1db\\ub1dc\\ub1dd\\ub1de\\ub1df\\ub1e0\\ub1e1\\ub1e2\\ub1e3\\ub1e4\\ub1e5\\ub1e6\\ub1e7\\ub1e8\\ub1e9\\ub1ea\\ub1eb\\ub1ec\\ub1ed\\ub1ee\\ub1ef\\ub1f0\\ub1f1\\ub1f2\\ub1f3\\ub1f4\\ub1f5\\ub1f6\\ub1f7\\ub1f8\\ub1f9\\ub1fa\\ub1fb\\ub1fc\\ub1fd\\ub1fe\\ub1ff\\ub200\\ub201\\ub202\\ub203\\ub204\\ub205\\ub206\\ub207\\ub208\\ub209\\ub20a\\ub20b\\ub20c\\ub20d\\ub20e\\ub20f\\ub210\\ub211\\ub212\\ub213\\ub214\\ub215\\ub216\\ub217\\ub218\\ub219\\ub21a\\ub21b\\ub21c\\ub21d\\ub21e\\ub21f\\ub220\\ub221\\ub222\\ub223\\ub224\\ub225\\ub226\\ub227\\ub228\\ub229\\ub22a\\ub22b\\ub22c\\ub22d\\ub22e\\ub22f\\ub230\\ub231\\ub232\\ub233\\ub234\\ub235\\ub236\\ub237\\ub238\\ub239\\ub23a\\ub23b\\ub23c\\ub23d\\ub23e\\ub23f\\ub240\\ub241\\ub242\\ub243\\ub244\\ub245\\ub246\\ub247\\ub248\\ub249\\ub24a\\ub24b\\ub24c\\ub24d\\ub24e\\ub24f\\ub250\\ub251\\ub252\\ub253\\ub254\\ub255\\ub256\\ub257\\ub258\\ub259\\ub25a\\ub25b\\ub25c\\ub25d\\ub25e\\ub25f\\ub260\\ub261\\ub262\\ub263\\ub264\\ub265\\ub266\\ub267\\ub268\\ub269\\ub26a\\ub26b\\ub26c\\ub26d\\ub26e\\ub26f\\ub270\\ub271\\ub272\\ub273\\ub274\\ub275\\ub276\\ub277\\ub278\\ub279\\ub27a\\ub27b\\ub27c\\ub27d\\ub27e\\ub27f\\ub280\\ub281\\ub282\\ub283\\ub284\\ub285\\ub286\\ub287\\ub288\\ub289\\ub28a\\ub28b\\ub28c\\ub28d\\ub28e\\ub28f\\ub290\\ub291\\ub292\\ub293\\ub294\\ub295\\ub296\\ub297\\ub298\\ub299\\ub29a\\ub29b\\ub29c\\ub29d\\ub29e\\ub29f\\ub2a0\\ub2a1\\ub2a2\\ub2a3\\ub2a4\\ub2a5\\ub2a6\\ub2a7\\ub2a8\\ub2a9\\ub2aa\\ub2ab\\ub2ac\\ub2ad\\ub2ae\\ub2af\\ub2b0\\ub2b1\\ub2b2\\ub2b3\\ub2b4\\ub2b5\\ub2b6\\ub2b7\\ub2b8\\ub2b9\\ub2ba\\ub2bb\\ub2bc\\ub2bd\\ub2be\\ub2bf\\ub2c0\\ub2c1\\ub2c2\\ub2c3\\ub2c4\\ub2c5\\ub2c6\\ub2c7\\ub2c8\\ub2c9\\ub2ca\\ub2cb\\ub2cc\\ub2cd\\ub2ce\\ub2cf\\ub2d0\\ub2d1\\ub2d2\\ub2d3\\ub2d4\\ub2d5\\ub2d6\\ub2d7\\ub2d8\\ub2d9\\ub2da\\ub2db\\ub2dc\\ub2dd\\ub2de\\ub2df\\ub2e0\\ub2e1\\ub2e2\\ub2e3\\ub2e4\\ub2e5\\ub2e6\\ub2e7\\ub2e8\\ub2e9\\ub2ea\\ub2eb\\ub2ec\\ub2ed\\ub2ee\\ub2ef\\ub2f0\\ub2f1\\ub2f2\\ub2f3\\ub2f4\\ub2f5\\ub2f6\\ub2f7\\ub2f8\\ub2f9\\ub2fa\\ub2fb\\ub2fc\\ub2fd\\ub2fe\\ub2ff\\ub300\\ub301\\ub302\\ub303\\ub304\\ub305\\ub306\\ub307\\ub308\\ub309\\ub30a\\ub30b\\ub30c\\ub30d\\ub30e\\ub30f\\ub310\\ub311\\ub312\\ub313\\ub314\\ub315\\ub316\\ub317\\ub318\\ub319\\ub31a\\ub31b\\ub31c\\ub31d\\ub31e\\ub31f\\ub320\\ub321\\ub322\\ub323\\ub324\\ub325\\ub326\\ub327\\ub328\\ub329\\ub32a\\ub32b\\ub32c\\ub32d\\ub32e\\ub32f\\ub330\\ub331\\ub332\\ub333\\ub334\\ub335\\ub336\\ub337\\ub338\\ub339\\ub33a\\ub33b\\ub33c\\ub33d\\ub33e\\ub33f\\ub340\\ub341\\ub342\\ub343\\ub344\\ub345\\ub346\\ub347\\ub348\\ub349\\ub34a\\ub34b\\ub34c\\ub34d\\ub34e\\ub34f\\ub350\\ub351\\ub352\\ub353\\ub354\\ub355\\ub356\\ub357\\ub358\\ub359\\ub35a\\ub35b\\ub35c\\ub35d\\ub35e\\ub35f\\ub360\\ub361\\ub362\\ub363\\ub364\\ub365\\ub366\\ub367\\ub368\\ub369\\ub36a\\ub36b\\ub36c\\ub36d\\ub36e\\ub36f\\ub370\\ub371\\ub372\\ub373\\ub374\\ub375\\ub376\\ub377\\ub378\\ub379\\ub37a\\ub37b\\ub37c\\ub37d\\ub37e\\ub37f\\ub380\\ub381\\ub382\\ub383\\ub384\\ub385\\ub386\\ub387\\ub388\\ub389\\ub38a\\ub38b\\ub38c\\ub38d\\ub38e\\ub38f\\ub390\\ub391\\ub392\\ub393\\ub394\\ub395\\ub396\\ub397\\ub398\\ub399\\ub39a\\ub39b\\ub39c\\ub39d\\ub39e\\ub39f\\ub3a0\\ub3a1\\ub3a2\\ub3a3\\ub3a4\\ub3a5\\ub3a6\\ub3a7\\ub3a8\\ub3a9\\ub3aa\\ub3ab\\ub3ac\\ub3ad\\ub3ae\\ub3af\\ub3b0\\ub3b1\\ub3b2\\ub3b3\\ub3b4\\ub3b5\\ub3b6\\ub3b7\\ub3b8\\ub3b9\\ub3ba\\ub3bb\\ub3bc\\ub3bd\\ub3be\\ub3bf\\ub3c0\\ub3c1\\ub3c2\\ub3c3\\ub3c4\\ub3c5\\ub3c6\\ub3c7\\ub3c8\\ub3c9\\ub3ca\\ub3cb\\ub3cc\\ub3cd\\ub3ce\\ub3cf\\ub3d0\\ub3d1\\ub3d2\\ub3d3\\ub3d4\\ub3d5\\ub3d6\\ub3d7\\ub3d8\\ub3d9\\ub3da\\ub3db\\ub3dc\\ub3dd\\ub3de\\ub3df\\ub3e0\\ub3e1\\ub3e2\\ub3e3\\ub3e4\\ub3e5\\ub3e6\\ub3e7\\ub3e8\\ub3e9\\ub3ea\\ub3eb\\ub3ec\\ub3ed\\ub3ee\\ub3ef\\ub3f0\\ub3f1\\ub3f2\\ub3f3\\ub3f4\\ub3f5\\ub3f6\\ub3f7\\ub3f8\\ub3f9\\ub3fa\\ub3fb\\ub3fc\\ub3fd\\ub3fe\\ub3ff\\ub400\\ub401\\ub402\\ub403\\ub404\\ub405\\ub406\\ub407\\ub408\\ub409\\ub40a\\ub40b\\ub40c\\ub40d\\ub40e\\ub40f\\ub410\\ub411\\ub412\\ub413\\ub414\\ub415\\ub416\\ub417\\ub418\\ub419\\ub41a\\ub41b\\ub41c\\ub41d\\ub41e\\ub41f\\ub420\\ub421\\ub422\\ub423\\ub424\\ub425\\ub426\\ub427\\ub428\\ub429\\ub42a\\ub42b\\ub42c\\ub42d\\ub42e\\ub42f\\ub430\\ub431\\ub432\\ub433\\ub434\\ub435\\ub436\\ub437\\ub438\\ub439\\ub43a\\ub43b\\ub43c\\ub43d\\ub43e\\ub43f\\ub440\\ub441\\ub442\\ub443\\ub444\\ub445\\ub446\\ub447\\ub448\\ub449\\ub44a\\ub44b\\ub44c\\ub44d\\ub44e\\ub44f\\ub450\\ub451\\ub452\\ub453\\ub454\\ub455\\ub456\\ub457\\ub458\\ub459\\ub45a\\ub45b\\ub45c\\ub45d\\ub45e\\ub45f\\ub460\\ub461\\ub462\\ub463\\ub464\\ub465\\ub466\\ub467\\ub468\\ub469\\ub46a\\ub46b\\ub46c\\ub46d\\ub46e\\ub46f\\ub470\\ub471\\ub472\\ub473\\ub474\\ub475\\ub476\\ub477\\ub478\\ub479\\ub47a\\ub47b\\ub47c\\ub47d\\ub47e\\ub47f\\ub480\\ub481\\ub482\\ub483\\ub484\\ub485\\ub486\\ub487\\ub488\\ub489\\ub48a\\ub48b\\ub48c\\ub48d\\ub48e\\ub48f\\ub490\\ub491\\ub492\\ub493\\ub494\\ub495\\ub496\\ub497\\ub498\\ub499\\ub49a\\ub49b\\ub49c\\ub49d\\ub49e\\ub49f\\ub4a0\\ub4a1\\ub4a2\\ub4a3\\ub4a4\\ub4a5\\ub4a6\\ub4a7\\ub4a8\\ub4a9\\ub4aa\\ub4ab\\ub4ac\\ub4ad\\ub4ae\\ub4af\\ub4b0\\ub4b1\\ub4b2\\ub4b3\\ub4b4\\ub4b5\\ub4b6\\ub4b7\\ub4b8\\ub4b9\\ub4ba\\ub4bb\\ub4bc\\ub4bd\\ub4be\\ub4bf\\ub4c0\\ub4c1\\ub4c2\\ub4c3\\ub4c4\\ub4c5\\ub4c6\\ub4c7\\ub4c8\\ub4c9\\ub4ca\\ub4cb\\ub4cc\\ub4cd\\ub4ce\\ub4cf\\ub4d0\\ub4d1\\ub4d2\\ub4d3\\ub4d4\\ub4d5\\ub4d6\\ub4d7\\ub4d8\\ub4d9\\ub4da\\ub4db\\ub4dc\\ub4dd\\ub4de\\ub4df\\ub4e0\\ub4e1\\ub4e2\\ub4e3\\ub4e4\\ub4e5\\ub4e6\\ub4e7\\ub4e8\\ub4e9\\ub4ea\\ub4eb\\ub4ec\\ub4ed\\ub4ee\\ub4ef\\ub4f0\\ub4f1\\ub4f2\\ub4f3\\ub4f4\\ub4f5\\ub4f6\\ub4f7\\ub4f8\\ub4f9\\ub4fa\\ub4fb\\ub4fc\\ub4fd\\ub4fe\\ub4ff\\ub500\\ub501\\ub502\\ub503\\ub504\\ub505\\ub506\\ub507\\ub508\\ub509\\ub50a\\ub50b\\ub50c\\ub50d\\ub50e\\ub50f\\ub510\\ub511\\ub512\\ub513\\ub514\\ub515\\ub516\\ub517\\ub518\\ub519\\ub51a\\ub51b\\ub51c\\ub51d\\ub51e\\ub51f\\ub520\\ub521\\ub522\\ub523\\ub524\\ub525\\ub526\\ub527\\ub528\\ub529\\ub52a\\ub52b\\ub52c\\ub52d\\ub52e\\ub52f\\ub530\\ub531\\ub532\\ub533\\ub534\\ub535\\ub536\\ub537\\ub538\\ub539\\ub53a\\ub53b\\ub53c\\ub53d\\ub53e\\ub53f\\ub540\\ub541\\ub542\\ub543\\ub544\\ub545\\ub546\\ub547\\ub548\\ub549\\ub54a\\ub54b\\ub54c\\ub54d\\ub54e\\ub54f\\ub550\\ub551\\ub552\\ub553\\ub554\\ub555\\ub556\\ub557\\ub558\\ub559\\ub55a\\ub55b\\ub55c\\ub55d\\ub55e\\ub55f\\ub560\\ub561\\ub562\\ub563\\ub564\\ub565\\ub566\\ub567\\ub568\\ub569\\ub56a\\ub56b\\ub56c\\ub56d\\ub56e\\ub56f\\ub570\\ub571\\ub572\\ub573\\ub574\\ub575\\ub576\\ub577\\ub578\\ub579\\ub57a\\ub57b\\ub57c\\ub57d\\ub57e\\ub57f\\ub580\\ub581\\ub582\\ub583\\ub584\\ub585\\ub586\\ub587\\ub588\\ub589\\ub58a\\ub58b\\ub58c\\ub58d\\ub58e\\ub58f\\ub590\\ub591\\ub592\\ub593\\ub594\\ub595\\ub596\\ub597\\ub598\\ub599\\ub59a\\ub59b\\ub59c\\ub59d\\ub59e\\ub59f\\ub5a0\\ub5a1\\ub5a2\\ub5a3\\ub5a4\\ub5a5\\ub5a6\\ub5a7\\ub5a8\\ub5a9\\ub5aa\\ub5ab\\ub5ac\\ub5ad\\ub5ae\\ub5af\\ub5b0\\ub5b1\\ub5b2\\ub5b3\\ub5b4\\ub5b5\\ub5b6\\ub5b7\\ub5b8\\ub5b9\\ub5ba\\ub5bb\\ub5bc\\ub5bd\\ub5be\\ub5bf\\ub5c0\\ub5c1\\ub5c2\\ub5c3\\ub5c4\\ub5c5\\ub5c6\\ub5c7\\ub5c8\\ub5c9\\ub5ca\\ub5cb\\ub5cc\\ub5cd\\ub5ce\\ub5cf\\ub5d0\\ub5d1\\ub5d2\\ub5d3\\ub5d4\\ub5d5\\ub5d6\\ub5d7\\ub5d8\\ub5d9\\ub5da\\ub5db\\ub5dc\\ub5dd\\ub5de\\ub5df\\ub5e0\\ub5e1\\ub5e2\\ub5e3\\ub5e4\\ub5e5\\ub5e6\\ub5e7\\ub5e8\\ub5e9\\ub5ea\\ub5eb\\ub5ec\\ub5ed\\ub5ee\\ub5ef\\ub5f0\\ub5f1\\ub5f2\\ub5f3\\ub5f4\\ub5f5\\ub5f6\\ub5f7\\ub5f8\\ub5f9\\ub5fa\\ub5fb\\ub5fc\\ub5fd\\ub5fe\\ub5ff\\ub600\\ub601\\ub602\\ub603\\ub604\\ub605\\ub606\\ub607\\ub608\\ub609\\ub60a\\ub60b\\ub60c\\ub60d\\ub60e\\ub60f\\ub610\\ub611\\ub612\\ub613\\ub614\\ub615\\ub616\\ub617\\ub618\\ub619\\ub61a\\ub61b\\ub61c\\ub61d\\ub61e\\ub61f\\ub620\\ub621\\ub622\\ub623\\ub624\\ub625\\ub626\\ub627\\ub628\\ub629\\ub62a\\ub62b\\ub62c\\ub62d\\ub62e\\ub62f\\ub630\\ub631\\ub632\\ub633\\ub634\\ub635\\ub636\\ub637\\ub638\\ub639\\ub63a\\ub63b\\ub63c\\ub63d\\ub63e\\ub63f\\ub640\\ub641\\ub642\\ub643\\ub644\\ub645\\ub646\\ub647\\ub648\\ub649\\ub64a\\ub64b\\ub64c\\ub64d\\ub64e\\ub64f\\ub650\\ub651\\ub652\\ub653\\ub654\\ub655\\ub656\\ub657\\ub658\\ub659\\ub65a\\ub65b\\ub65c\\ub65d\\ub65e\\ub65f\\ub660\\ub661\\ub662\\ub663\\ub664\\ub665\\ub666\\ub667\\ub668\\ub669\\ub66a\\ub66b\\ub66c\\ub66d\\ub66e\\ub66f\\ub670\\ub671\\ub672\\ub673\\ub674\\ub675\\ub676\\ub677\\ub678\\ub679\\ub67a\\ub67b\\ub67c\\ub67d\\ub67e\\ub67f\\ub680\\ub681\\ub682\\ub683\\ub684\\ub685\\ub686\\ub687\\ub688\\ub689\\ub68a\\ub68b\\ub68c\\ub68d\\ub68e\\ub68f\\ub690\\ub691\\ub692\\ub693\\ub694\\ub695\\ub696\\ub697\\ub698\\ub699\\ub69a\\ub69b\\ub69c\\ub69d\\ub69e\\ub69f\\ub6a0\\ub6a1\\ub6a2\\ub6a3\\ub6a4\\ub6a5\\ub6a6\\ub6a7\\ub6a8\\ub6a9\\ub6aa\\ub6ab\\ub6ac\\ub6ad\\ub6ae\\ub6af\\ub6b0\\ub6b1\\ub6b2\\ub6b3\\ub6b4\\ub6b5\\ub6b6\\ub6b7\\ub6b8\\ub6b9\\ub6ba\\ub6bb\\ub6bc\\ub6bd\\ub6be\\ub6bf\\ub6c0\\ub6c1\\ub6c2\\ub6c3\\ub6c4\\ub6c5\\ub6c6\\ub6c7\\ub6c8\\ub6c9\\ub6ca\\ub6cb\\ub6cc\\ub6cd\\ub6ce\\ub6cf\\ub6d0\\ub6d1\\ub6d2\\ub6d3\\ub6d4\\ub6d5\\ub6d6\\ub6d7\\ub6d8\\ub6d9\\ub6da\\ub6db\\ub6dc\\ub6dd\\ub6de\\ub6df\\ub6e0\\ub6e1\\ub6e2\\ub6e3\\ub6e4\\ub6e5\\ub6e6\\ub6e7\\ub6e8\\ub6e9\\ub6ea\\ub6eb\\ub6ec\\ub6ed\\ub6ee\\ub6ef\\ub6f0\\ub6f1\\ub6f2\\ub6f3\\ub6f4\\ub6f5\\ub6f6\\ub6f7\\ub6f8\\ub6f9\\ub6fa\\ub6fb\\ub6fc\\ub6fd\\ub6fe\\ub6ff\\ub700\\ub701\\ub702\\ub703\\ub704\\ub705\\ub706\\ub707\\ub708\\ub709\\ub70a\\ub70b\\ub70c\\ub70d\\ub70e\\ub70f\\ub710\\ub711\\ub712\\ub713\\ub714\\ub715\\ub716\\ub717\\ub718\\ub719\\ub71a\\ub71b\\ub71c\\ub71d\\ub71e\\ub71f\\ub720\\ub721\\ub722\\ub723\\ub724\\ub725\\ub726\\ub727\\ub728\\ub729\\ub72a\\ub72b\\ub72c\\ub72d\\ub72e\\ub72f\\ub730\\ub731\\ub732\\ub733\\ub734\\ub735\\ub736\\ub737\\ub738\\ub739\\ub73a\\ub73b\\ub73c\\ub73d\\ub73e\\ub73f\\ub740\\ub741\\ub742\\ub743\\ub744\\ub745\\ub746\\ub747\\ub748\\ub749\\ub74a\\ub74b\\ub74c\\ub74d\\ub74e\\ub74f\\ub750\\ub751\\ub752\\ub753\\ub754\\ub755\\ub756\\ub757\\ub758\\ub759\\ub75a\\ub75b\\ub75c\\ub75d\\ub75e\\ub75f\\ub760\\ub761\\ub762\\ub763\\ub764\\ub765\\ub766\\ub767\\ub768\\ub769\\ub76a\\ub76b\\ub76c\\ub76d\\ub76e\\ub76f\\ub770\\ub771\\ub772\\ub773\\ub774\\ub775\\ub776\\ub777\\ub778\\ub779\\ub77a\\ub77b\\ub77c\\ub77d\\ub77e\\ub77f\\ub780\\ub781\\ub782\\ub783\\ub784\\ub785\\ub786\\ub787\\ub788\\ub789\\ub78a\\ub78b\\ub78c\\ub78d\\ub78e\\ub78f\\ub790\\ub791\\ub792\\ub793\\ub794\\ub795\\ub796\\ub797\\ub798\\ub799\\ub79a\\ub79b\\ub79c\\ub79d\\ub79e\\ub79f\\ub7a0\\ub7a1\\ub7a2\\ub7a3\\ub7a4\\ub7a5\\ub7a6\\ub7a7\\ub7a8\\ub7a9\\ub7aa\\ub7ab\\ub7ac\\ub7ad\\ub7ae\\ub7af\\ub7b0\\ub7b1\\ub7b2\\ub7b3\\ub7b4\\ub7b5\\ub7b6\\ub7b7\\ub7b8\\ub7b9\\ub7ba\\ub7bb\\ub7bc\\ub7bd\\ub7be\\ub7bf\\ub7c0\\ub7c1\\ub7c2\\ub7c3\\ub7c4\\ub7c5\\ub7c6\\ub7c7\\ub7c8\\ub7c9\\ub7ca\\ub7cb\\ub7cc\\ub7cd\\ub7ce\\ub7cf\\ub7d0\\ub7d1\\ub7d2\\ub7d3\\ub7d4\\ub7d5\\ub7d6\\ub7d7\\ub7d8\\ub7d9\\ub7da\\ub7db\\ub7dc\\ub7dd\\ub7de\\ub7df\\ub7e0\\ub7e1\\ub7e2\\ub7e3\\ub7e4\\ub7e5\\ub7e6\\ub7e7\\ub7e8\\ub7e9\\ub7ea\\ub7eb\\ub7ec\\ub7ed\\ub7ee\\ub7ef\\ub7f0\\ub7f1\\ub7f2\\ub7f3\\ub7f4\\ub7f5\\ub7f6\\ub7f7\\ub7f8\\ub7f9\\ub7fa\\ub7fb\\ub7fc\\ub7fd\\ub7fe\\ub7ff\\ub800\\ub801\\ub802\\ub803\\ub804\\ub805\\ub806\\ub807\\ub808\\ub809\\ub80a\\ub80b\\ub80c\\ub80d\\ub80e\\ub80f\\ub810\\ub811\\ub812\\ub813\\ub814\\ub815\\ub816\\ub817\\ub818\\ub819\\ub81a\\ub81b\\ub81c\\ub81d\\ub81e\\ub81f\\ub820\\ub821\\ub822\\ub823\\ub824\\ub825\\ub826\\ub827\\ub828\\ub829\\ub82a\\ub82b\\ub82c\\ub82d\\ub82e\\ub82f\\ub830\\ub831\\ub832\\ub833\\ub834\\ub835\\ub836\\ub837\\ub838\\ub839\\ub83a\\ub83b\\ub83c\\ub83d\\ub83e\\ub83f\\ub840\\ub841\\ub842\\ub843\\ub844\\ub845\\ub846\\ub847\\ub848\\ub849\\ub84a\\ub84b\\ub84c\\ub84d\\ub84e\\ub84f\\ub850\\ub851\\ub852\\ub853\\ub854\\ub855\\ub856\\ub857\\ub858\\ub859\\ub85a\\ub85b\\ub85c\\ub85d\\ub85e\\ub85f\\ub860\\ub861\\ub862\\ub863\\ub864\\ub865\\ub866\\ub867\\ub868\\ub869\\ub86a\\ub86b\\ub86c\\ub86d\\ub86e\\ub86f\\ub870\\ub871\\ub872\\ub873\\ub874\\ub875\\ub876\\ub877\\ub878\\ub879\\ub87a\\ub87b\\ub87c\\ub87d\\ub87e\\ub87f\\ub880\\ub881\\ub882\\ub883\\ub884\\ub885\\ub886\\ub887\\ub888\\ub889\\ub88a\\ub88b\\ub88c\\ub88d\\ub88e\\ub88f\\ub890\\ub891\\ub892\\ub893\\ub894\\ub895\\ub896\\ub897\\ub898\\ub899\\ub89a\\ub89b\\ub89c\\ub89d\\ub89e\\ub89f\\ub8a0\\ub8a1\\ub8a2\\ub8a3\\ub8a4\\ub8a5\\ub8a6\\ub8a7\\ub8a8\\ub8a9\\ub8aa\\ub8ab\\ub8ac\\ub8ad\\ub8ae\\ub8af\\ub8b0\\ub8b1\\ub8b2\\ub8b3\\ub8b4\\ub8b5\\ub8b6\\ub8b7\\ub8b8\\ub8b9\\ub8ba\\ub8bb\\ub8bc\\ub8bd\\ub8be\\ub8bf\\ub8c0\\ub8c1\\ub8c2\\ub8c3\\ub8c4\\ub8c5\\ub8c6\\ub8c7\\ub8c8\\ub8c9\\ub8ca\\ub8cb\\ub8cc\\ub8cd\\ub8ce\\ub8cf\\ub8d0\\ub8d1\\ub8d2\\ub8d3\\ub8d4\\ub8d5\\ub8d6\\ub8d7\\ub8d8\\ub8d9\\ub8da\\ub8db\\ub8dc\\ub8dd\\ub8de\\ub8df\\ub8e0\\ub8e1\\ub8e2\\ub8e3\\ub8e4\\ub8e5\\ub8e6\\ub8e7\\ub8e8\\ub8e9\\ub8ea\\ub8eb\\ub8ec\\ub8ed\\ub8ee\\ub8ef\\ub8f0\\ub8f1\\ub8f2\\ub8f3\\ub8f4\\ub8f5\\ub8f6\\ub8f7\\ub8f8\\ub8f9\\ub8fa\\ub8fb\\ub8fc\\ub8fd\\ub8fe\\ub8ff\\ub900\\ub901\\ub902\\ub903\\ub904\\ub905\\ub906\\ub907\\ub908\\ub909\\ub90a\\ub90b\\ub90c\\ub90d\\ub90e\\ub90f\\ub910\\ub911\\ub912\\ub913\\ub914\\ub915\\ub916\\ub917\\ub918\\ub919\\ub91a\\ub91b\\ub91c\\ub91d\\ub91e\\ub91f\\ub920\\ub921\\ub922\\ub923\\ub924\\ub925\\ub926\\ub927\\ub928\\ub929\\ub92a\\ub92b\\ub92c\\ub92d\\ub92e\\ub92f\\ub930\\ub931\\ub932\\ub933\\ub934\\ub935\\ub936\\ub937\\ub938\\ub939\\ub93a\\ub93b\\ub93c\\ub93d\\ub93e\\ub93f\\ub940\\ub941\\ub942\\ub943\\ub944\\ub945\\ub946\\ub947\\ub948\\ub949\\ub94a\\ub94b\\ub94c\\ub94d\\ub94e\\ub94f\\ub950\\ub951\\ub952\\ub953\\ub954\\ub955\\ub956\\ub957\\ub958\\ub959\\ub95a\\ub95b\\ub95c\\ub95d\\ub95e\\ub95f\\ub960\\ub961\\ub962\\ub963\\ub964\\ub965\\ub966\\ub967\\ub968\\ub969\\ub96a\\ub96b\\ub96c\\ub96d\\ub96e\\ub96f\\ub970\\ub971\\ub972\\ub973\\ub974\\ub975\\ub976\\ub977\\ub978\\ub979\\ub97a\\ub97b\\ub97c\\ub97d\\ub97e\\ub97f\\ub980\\ub981\\ub982\\ub983\\ub984\\ub985\\ub986\\ub987\\ub988\\ub989\\ub98a\\ub98b\\ub98c\\ub98d\\ub98e\\ub98f\\ub990\\ub991\\ub992\\ub993\\ub994\\ub995\\ub996\\ub997\\ub998\\ub999\\ub99a\\ub99b\\ub99c\\ub99d\\ub99e\\ub99f\\ub9a0\\ub9a1\\ub9a2\\ub9a3\\ub9a4\\ub9a5\\ub9a6\\ub9a7\\ub9a8\\ub9a9\\ub9aa\\ub9ab\\ub9ac\\ub9ad\\ub9ae\\ub9af\\ub9b0\\ub9b1\\ub9b2\\ub9b3\\ub9b4\\ub9b5\\ub9b6\\ub9b7\\ub9b8\\ub9b9\\ub9ba\\ub9bb\\ub9bc\\ub9bd\\ub9be\\ub9bf\\ub9c0\\ub9c1\\ub9c2\\ub9c3\\ub9c4\\ub9c5\\ub9c6\\ub9c7\\ub9c8\\ub9c9\\ub9ca\\ub9cb\\ub9cc\\ub9cd\\ub9ce\\ub9cf\\ub9d0\\ub9d1\\ub9d2\\ub9d3\\ub9d4\\ub9d5\\ub9d6\\ub9d7\\ub9d8\\ub9d9\\ub9da\\ub9db\\ub9dc\\ub9dd\\ub9de\\ub9df\\ub9e0\\ub9e1\\ub9e2\\ub9e3\\ub9e4\\ub9e5\\ub9e6\\ub9e7\\ub9e8\\ub9e9\\ub9ea\\ub9eb\\ub9ec\\ub9ed\\ub9ee\\ub9ef\\ub9f0\\ub9f1\\ub9f2\\ub9f3\\ub9f4\\ub9f5\\ub9f6\\ub9f7\\ub9f8\\ub9f9\\ub9fa\\ub9fb\\ub9fc\\ub9fd\\ub9fe\\ub9ff\\uba00\\uba01\\uba02\\uba03\\uba04\\uba05\\uba06\\uba07\\uba08\\uba09\\uba0a\\uba0b\\uba0c\\uba0d\\uba0e\\uba0f\\uba10\\uba11\\uba12\\uba13\\uba14\\uba15\\uba16\\uba17\\uba18\\uba19\\uba1a\\uba1b\\uba1c\\uba1d\\uba1e\\uba1f\\uba20\\uba21\\uba22\\uba23\\uba24\\uba25\\uba26\\uba27\\uba28\\uba29\\uba2a\\uba2b\\uba2c\\uba2d\\uba2e\\uba2f\\uba30\\uba31\\uba32\\uba33\\uba34\\uba35\\uba36\\uba37\\uba38\\uba39\\uba3a\\uba3b\\uba3c\\uba3d\\uba3e\\uba3f\\uba40\\uba41\\uba42\\uba43\\uba44\\uba45\\uba46\\uba47\\uba48\\uba49\\uba4a\\uba4b\\uba4c\\uba4d\\uba4e\\uba4f\\uba50\\uba51\\uba52\\uba53\\uba54\\uba55\\uba56\\uba57\\uba58\\uba59\\uba5a\\uba5b\\uba5c\\uba5d\\uba5e\\uba5f\\uba60\\uba61\\uba62\\uba63\\uba64\\uba65\\uba66\\uba67\\uba68\\uba69\\uba6a\\uba6b\\uba6c\\uba6d\\uba6e\\uba6f\\uba70\\uba71\\uba72\\uba73\\uba74\\uba75\\uba76\\uba77\\uba78\\uba79\\uba7a\\uba7b\\uba7c\\uba7d\\uba7e\\uba7f\\uba80\\uba81\\uba82\\uba83\\uba84\\uba85\\uba86\\uba87\\uba88\\uba89\\uba8a\\uba8b\\uba8c\\uba8d\\uba8e\\uba8f\\uba90\\uba91\\uba92\\uba93\\uba94\\uba95\\uba96\\uba97\\uba98\\uba99\\uba9a\\uba9b\\uba9c\\uba9d\\uba9e\\uba9f\\ubaa0\\ubaa1\\ubaa2\\ubaa3\\ubaa4\\ubaa5\\ubaa6\\ubaa7\\ubaa8\\ubaa9\\ubaaa\\ubaab\\ubaac\\ubaad\\ubaae\\ubaaf\\ubab0\\ubab1\\ubab2\\ubab3\\ubab4\\ubab5\\ubab6\\ubab7\\ubab8\\ubab9\\ubaba\\ubabb\\ubabc\\ubabd\\ubabe\\ubabf\\ubac0\\ubac1\\ubac2\\ubac3\\ubac4\\ubac5\\ubac6\\ubac7\\ubac8\\ubac9\\ubaca\\ubacb\\ubacc\\ubacd\\ubace\\ubacf\\ubad0\\ubad1\\ubad2\\ubad3\\ubad4\\ubad5\\ubad6\\ubad7\\ubad8\\ubad9\\ubada\\ubadb\\ubadc\\ubadd\\ubade\\ubadf\\ubae0\\ubae1\\ubae2\\ubae3\\ubae4\\ubae5\\ubae6\\ubae7\\ubae8\\ubae9\\ubaea\\ubaeb\\ubaec\\ubaed\\ubaee\\ubaef\\ubaf0\\ubaf1\\ubaf2\\ubaf3\\ubaf4\\ubaf5\\ubaf6\\ubaf7\\ubaf8\\ubaf9\\ubafa\\ubafb\\ubafc\\ubafd\\ubafe\\ubaff\\ubb00\\ubb01\\ubb02\\ubb03\\ubb04\\ubb05\\ubb06\\ubb07\\ubb08\\ubb09\\ubb0a\\ubb0b\\ubb0c\\ubb0d\\ubb0e\\ubb0f\\ubb10\\ubb11\\ubb12\\ubb13\\ubb14\\ubb15\\ubb16\\ubb17\\ubb18\\ubb19\\ubb1a\\ubb1b\\ubb1c\\ubb1d\\ubb1e\\ubb1f\\ubb20\\ubb21\\ubb22\\ubb23\\ubb24\\ubb25\\ubb26\\ubb27\\ubb28\\ubb29\\ubb2a\\ubb2b\\ubb2c\\ubb2d\\ubb2e\\ubb2f\\ubb30\\ubb31\\ubb32\\ubb33\\ubb34\\ubb35\\ubb36\\ubb37\\ubb38\\ubb39\\ubb3a\\ubb3b\\ubb3c\\ubb3d\\ubb3e\\ubb3f\\ubb40\\ubb41\\ubb42\\ubb43\\ubb44\\ubb45\\ubb46\\ubb47\\ubb48\\ubb49\\ubb4a\\ubb4b\\ubb4c\\ubb4d\\ubb4e\\ubb4f\\ubb50\\ubb51\\ubb52\\ubb53\\ubb54\\ubb55\\ubb56\\ubb57\\ubb58\\ubb59\\ubb5a\\ubb5b\\ubb5c\\ubb5d\\ubb5e\\ubb5f\\ubb60\\ubb61\\ubb62\\ubb63\\ubb64\\ubb65\\ubb66\\ubb67\\ubb68\\ubb69\\ubb6a\\ubb6b\\ubb6c\\ubb6d\\ubb6e\\ubb6f\\ubb70\\ubb71\\ubb72\\ubb73\\ubb74\\ubb75\\ubb76\\ubb77\\ubb78\\ubb79\\ubb7a\\ubb7b\\ubb7c\\ubb7d\\ubb7e\\ubb7f\\ubb80\\ubb81\\ubb82\\ubb83\\ubb84\\ubb85\\ubb86\\ubb87\\ubb88\\ubb89\\ubb8a\\ubb8b\\ubb8c\\ubb8d\\ubb8e\\ubb8f\\ubb90\\ubb91\\ubb92\\ubb93\\ubb94\\ubb95\\ubb96\\ubb97\\ubb98\\ubb99\\ubb9a\\ubb9b\\ubb9c\\ubb9d\\ubb9e\\ubb9f\\ubba0\\ubba1\\ubba2\\ubba3\\ubba4\\ubba5\\ubba6\\ubba7\\ubba8\\ubba9\\ubbaa\\ubbab\\ubbac\\ubbad\\ubbae\\ubbaf\\ubbb0\\ubbb1\\ubbb2\\ubbb3\\ubbb4\\ubbb5\\ubbb6\\ubbb7\\ubbb8\\ubbb9\\ubbba\\ubbbb\\ubbbc\\ubbbd\\ubbbe\\ubbbf\\ubbc0\\ubbc1\\ubbc2\\ubbc3\\ubbc4\\ubbc5\\ubbc6\\ubbc7\\ubbc8\\ubbc9\\ubbca\\ubbcb\\ubbcc\\ubbcd\\ubbce\\ubbcf\\ubbd0\\ubbd1\\ubbd2\\ubbd3\\ubbd4\\ubbd5\\ubbd6\\ubbd7\\ubbd8\\ubbd9\\ubbda\\ubbdb\\ubbdc\\ubbdd\\ubbde\\ubbdf\\ubbe0\\ubbe1\\ubbe2\\ubbe3\\ubbe4\\ubbe5\\ubbe6\\ubbe7\\ubbe8\\ubbe9\\ubbea\\ubbeb\\ubbec\\ubbed\\ubbee\\ubbef\\ubbf0\\ubbf1\\ubbf2\\ubbf3\\ubbf4\\ubbf5\\ubbf6\\ubbf7\\ubbf8\\ubbf9\\ubbfa\\ubbfb\\ubbfc\\ubbfd\\ubbfe\\ubbff\\ubc00\\ubc01\\ubc02\\ubc03\\ubc04\\ubc05\\ubc06\\ubc07\\ubc08\\ubc09\\ubc0a\\ubc0b\\ubc0c\\ubc0d\\ubc0e\\ubc0f\\ubc10\\ubc11\\ubc12\\ubc13\\ubc14\\ubc15\\ubc16\\ubc17\\ubc18\\ubc19\\ubc1a\\ubc1b\\ubc1c\\ubc1d\\ubc1e\\ubc1f\\ubc20\\ubc21\\ubc22\\ubc23\\ubc24\\ubc25\\ubc26\\ubc27\\ubc28\\ubc29\\ubc2a\\ubc2b\\ubc2c\\ubc2d\\ubc2e\\ubc2f\\ubc30\\ubc31\\ubc32\\ubc33\\ubc34\\ubc35\\ubc36\\ubc37\\ubc38\\ubc39\\ubc3a\\ubc3b\\ubc3c\\ubc3d\\ubc3e\\ubc3f\\ubc40\\ubc41\\ubc42\\ubc43\\ubc44\\ubc45\\ubc46\\ubc47\\ubc48\\ubc49\\ubc4a\\ubc4b\\ubc4c\\ubc4d\\ubc4e\\ubc4f\\ubc50\\ubc51\\ubc52\\ubc53\\ubc54\\ubc55\\ubc56\\ubc57\\ubc58\\ubc59\\ubc5a\\ubc5b\\ubc5c\\ubc5d\\ubc5e\\ubc5f\\ubc60\\ubc61\\ubc62\\ubc63\\ubc64\\ubc65\\ubc66\\ubc67\\ubc68\\ubc69\\ubc6a\\ubc6b\\ubc6c\\ubc6d\\ubc6e\\ubc6f\\ubc70\\ubc71\\ubc72\\ubc73\\ubc74\\ubc75\\ubc76\\ubc77\\ubc78\\ubc79\\ubc7a\\ubc7b\\ubc7c\\ubc7d\\ubc7e\\ubc7f\\ubc80\\ubc81\\ubc82\\ubc83\\ubc84\\ubc85\\ubc86\\ubc87\\ubc88\\ubc89\\ubc8a\\ubc8b\\ubc8c\\ubc8d\\ubc8e\\ubc8f\\ubc90\\ubc91\\ubc92\\ubc93\\ubc94\\ubc95\\ubc96\\ubc97\\ubc98\\ubc99\\ubc9a\\ubc9b\\ubc9c\\ubc9d\\ubc9e\\ubc9f\\ubca0\\ubca1\\ubca2\\ubca3\\ubca4\\ubca5\\ubca6\\ubca7\\ubca8\\ubca9\\ubcaa\\ubcab\\ubcac\\ubcad\\ubcae\\ubcaf\\ubcb0\\ubcb1\\ubcb2\\ubcb3\\ubcb4\\ubcb5\\ubcb6\\ubcb7\\ubcb8\\ubcb9\\ubcba\\ubcbb\\ubcbc\\ubcbd\\ubcbe\\ubcbf\\ubcc0\\ubcc1\\ubcc2\\ubcc3\\ubcc4\\ubcc5\\ubcc6\\ubcc7\\ubcc8\\ubcc9\\ubcca\\ubccb\\ubccc\\ubccd\\ubcce\\ubccf\\ubcd0\\ubcd1\\ubcd2\\ubcd3\\ubcd4\\ubcd5\\ubcd6\\ubcd7\\ubcd8\\ubcd9\\ubcda\\ubcdb\\ubcdc\\ubcdd\\ubcde\\ubcdf\\ubce0\\ubce1\\ubce2\\ubce3\\ubce4\\ubce5\\ubce6\\ubce7\\ubce8\\ubce9\\ubcea\\ubceb\\ubcec\\ubced\\ubcee\\ubcef\\ubcf0\\ubcf1\\ubcf2\\ubcf3\\ubcf4\\ubcf5\\ubcf6\\ubcf7\\ubcf8\\ubcf9\\ubcfa\\ubcfb\\ubcfc\\ubcfd\\ubcfe\\ubcff\\ubd00\\ubd01\\ubd02\\ubd03\\ubd04\\ubd05\\ubd06\\ubd07\\ubd08\\ubd09\\ubd0a\\ubd0b\\ubd0c\\ubd0d\\ubd0e\\ubd0f\\ubd10\\ubd11\\ubd12\\ubd13\\ubd14\\ubd15\\ubd16\\ubd17\\ubd18\\ubd19\\ubd1a\\ubd1b\\ubd1c\\ubd1d\\ubd1e\\ubd1f\\ubd20\\ubd21\\ubd22\\ubd23\\ubd24\\ubd25\\ubd26\\ubd27\\ubd28\\ubd29\\ubd2a\\ubd2b\\ubd2c\\ubd2d\\ubd2e\\ubd2f\\ubd30\\ubd31\\ubd32\\ubd33\\ubd34\\ubd35\\ubd36\\ubd37\\ubd38\\ubd39\\ubd3a\\ubd3b\\ubd3c\\ubd3d\\ubd3e\\ubd3f\\ubd40\\ubd41\\ubd42\\ubd43\\ubd44\\ubd45\\ubd46\\ubd47\\ubd48\\ubd49\\ubd4a\\ubd4b\\ubd4c\\ubd4d\\ubd4e\\ubd4f\\ubd50\\ubd51\\ubd52\\ubd53\\ubd54\\ubd55\\ubd56\\ubd57\\ubd58\\ubd59\\ubd5a\\ubd5b\\ubd5c\\ubd5d\\ubd5e\\ubd5f\\ubd60\\ubd61\\ubd62\\ubd63\\ubd64\\ubd65\\ubd66\\ubd67\\ubd68\\ubd69\\ubd6a\\ubd6b\\ubd6c\\ubd6d\\ubd6e\\ubd6f\\ubd70\\ubd71\\ubd72\\ubd73\\ubd74\\ubd75\\ubd76\\ubd77\\ubd78\\ubd79\\ubd7a\\ubd7b\\ubd7c\\ubd7d\\ubd7e\\ubd7f\\ubd80\\ubd81\\ubd82\\ubd83\\ubd84\\ubd85\\ubd86\\ubd87\\ubd88\\ubd89\\ubd8a\\ubd8b\\ubd8c\\ubd8d\\ubd8e\\ubd8f\\ubd90\\ubd91\\ubd92\\ubd93\\ubd94\\ubd95\\ubd96\\ubd97\\ubd98\\ubd99\\ubd9a\\ubd9b\\ubd9c\\ubd9d\\ubd9e\\ubd9f\\ubda0\\ubda1\\ubda2\\ubda3\\ubda4\\ubda5\\ubda6\\ubda7\\ubda8\\ubda9\\ubdaa\\ubdab\\ubdac\\ubdad\\ubdae\\ubdaf\\ubdb0\\ubdb1\\ubdb2\\ubdb3\\ubdb4\\ubdb5\\ubdb6\\ubdb7\\ubdb8\\ubdb9\\ubdba\\ubdbb\\ubdbc\\ubdbd\\ubdbe\\ubdbf\\ubdc0\\ubdc1\\ubdc2\\ubdc3\\ubdc4\\ubdc5\\ubdc6\\ubdc7\\ubdc8\\ubdc9\\ubdca\\ubdcb\\ubdcc\\ubdcd\\ubdce\\ubdcf\\ubdd0\\ubdd1\\ubdd2\\ubdd3\\ubdd4\\ubdd5\\ubdd6\\ubdd7\\ubdd8\\ubdd9\\ubdda\\ubddb\\ubddc\\ubddd\\ubdde\\ubddf\\ubde0\\ubde1\\ubde2\\ubde3\\ubde4\\ubde5\\ubde6\\ubde7\\ubde8\\ubde9\\ubdea\\ubdeb\\ubdec\\ubded\\ubdee\\ubdef\\ubdf0\\ubdf1\\ubdf2\\ubdf3\\ubdf4\\ubdf5\\ubdf6\\ubdf7\\ubdf8\\ubdf9\\ubdfa\\ubdfb\\ubdfc\\ubdfd\\ubdfe\\ubdff\\ube00\\ube01\\ube02\\ube03\\ube04\\ube05\\ube06\\ube07\\ube08\\ube09\\ube0a\\ube0b\\ube0c\\ube0d\\ube0e\\ube0f\\ube10\\ube11\\ube12\\ube13\\ube14\\ube15\\ube16\\ube17\\ube18\\ube19\\ube1a\\ube1b\\ube1c\\ube1d\\ube1e\\ube1f\\ube20\\ube21\\ube22\\ube23\\ube24\\ube25\\ube26\\ube27\\ube28\\ube29\\ube2a\\ube2b\\ube2c\\ube2d\\ube2e\\ube2f\\ube30\\ube31\\ube32\\ube33\\ube34\\ube35\\ube36\\ube37\\ube38\\ube39\\ube3a\\ube3b\\ube3c\\ube3d\\ube3e\\ube3f\\ube40\\ube41\\ube42\\ube43\\ube44\\ube45\\ube46\\ube47\\ube48\\ube49\\ube4a\\ube4b\\ube4c\\ube4d\\ube4e\\ube4f\\ube50\\ube51\\ube52\\ube53\\ube54\\ube55\\ube56\\ube57\\ube58\\ube59\\ube5a\\ube5b\\ube5c\\ube5d\\ube5e\\ube5f\\ube60\\ube61\\ube62\\ube63\\ube64\\ube65\\ube66\\ube67\\ube68\\ube69\\ube6a\\ube6b\\ube6c\\ube6d\\ube6e\\ube6f\\ube70\\ube71\\ube72\\ube73\\ube74\\ube75\\ube76\\ube77\\ube78\\ube79\\ube7a\\ube7b\\ube7c\\ube7d\\ube7e\\ube7f\\ube80\\ube81\\ube82\\ube83\\ube84\\ube85\\ube86\\ube87\\ube88\\ube89\\ube8a\\ube8b\\ube8c\\ube8d\\ube8e\\ube8f\\ube90\\ube91\\ube92\\ube93\\ube94\\ube95\\ube96\\ube97\\ube98\\ube99\\ube9a\\ube9b\\ube9c\\ube9d\\ube9e\\ube9f\\ubea0\\ubea1\\ubea2\\ubea3\\ubea4\\ubea5\\ubea6\\ubea7\\ubea8\\ubea9\\ubeaa\\ubeab\\ubeac\\ubead\\ubeae\\ubeaf\\ubeb0\\ubeb1\\ubeb2\\ubeb3\\ubeb4\\ubeb5\\ubeb6\\ubeb7\\ubeb8\\ubeb9\\ubeba\\ubebb\\ubebc\\ubebd\\ubebe\\ubebf\\ubec0\\ubec1\\ubec2\\ubec3\\ubec4\\ubec5\\ubec6\\ubec7\\ubec8\\ubec9\\ubeca\\ubecb\\ubecc\\ubecd\\ubece\\ubecf\\ubed0\\ubed1\\ubed2\\ubed3\\ubed4\\ubed5\\ubed6\\ubed7\\ubed8\\ubed9\\ubeda\\ubedb\\ubedc\\ubedd\\ubede\\ubedf\\ubee0\\ubee1\\ubee2\\ubee3\\ubee4\\ubee5\\ubee6\\ubee7\\ubee8\\ubee9\\ubeea\\ubeeb\\ubeec\\ubeed\\ubeee\\ubeef\\ubef0\\ubef1\\ubef2\\ubef3\\ubef4\\ubef5\\ubef6\\ubef7\\ubef8\\ubef9\\ubefa\\ubefb\\ubefc\\ubefd\\ubefe\\ubeff\\ubf00\\ubf01\\ubf02\\ubf03\\ubf04\\ubf05\\ubf06\\ubf07\\ubf08\\ubf09\\ubf0a\\ubf0b\\ubf0c\\ubf0d\\ubf0e\\ubf0f\\ubf10\\ubf11\\ubf12\\ubf13\\ubf14\\ubf15\\ubf16\\ubf17\\ubf18\\ubf19\\ubf1a\\ubf1b\\ubf1c\\ubf1d\\ubf1e\\ubf1f\\ubf20\\ubf21\\ubf22\\ubf23\\ubf24\\ubf25\\ubf26\\ubf27\\ubf28\\ubf29\\ubf2a\\ubf2b\\ubf2c\\ubf2d\\ubf2e\\ubf2f\\ubf30\\ubf31\\ubf32\\ubf33\\ubf34\\ubf35\\ubf36\\ubf37\\ubf38\\ubf39\\ubf3a\\ubf3b\\ubf3c\\ubf3d\\ubf3e\\ubf3f\\ubf40\\ubf41\\ubf42\\ubf43\\ubf44\\ubf45\\ubf46\\ubf47\\ubf48\\ubf49\\ubf4a\\ubf4b\\ubf4c\\ubf4d\\ubf4e\\ubf4f\\ubf50\\ubf51\\ubf52\\ubf53\\ubf54\\ubf55\\ubf56\\ubf57\\ubf58\\ubf59\\ubf5a\\ubf5b\\ubf5c\\ubf5d\\ubf5e\\ubf5f\\ubf60\\ubf61\\ubf62\\ubf63\\ubf64\\ubf65\\ubf66\\ubf67\\ubf68\\ubf69\\ubf6a\\ubf6b\\ubf6c\\ubf6d\\ubf6e\\ubf6f\\ubf70\\ubf71\\ubf72\\ubf73\\ubf74\\ubf75\\ubf76\\ubf77\\ubf78\\ubf79\\ubf7a\\ubf7b\\ubf7c\\ubf7d\\ubf7e\\ubf7f\\ubf80\\ubf81\\ubf82\\ubf83\\ubf84\\ubf85\\ubf86\\ubf87\\ubf88\\ubf89\\ubf8a\\ubf8b\\ubf8c\\ubf8d\\ubf8e\\ubf8f\\ubf90\\ubf91\\ubf92\\ubf93\\ubf94\\ubf95\\ubf96\\ubf97\\ubf98\\ubf99\\ubf9a\\ubf9b\\ubf9c\\ubf9d\\ubf9e\\ubf9f\\ubfa0\\ubfa1\\ubfa2\\ubfa3\\ubfa4\\ubfa5\\ubfa6\\ubfa7\\ubfa8\\ubfa9\\ubfaa\\ubfab\\ubfac\\ubfad\\ubfae\\ubfaf\\ubfb0\\ubfb1\\ubfb2\\ubfb3\\ubfb4\\ubfb5\\ubfb6\\ubfb7\\ubfb8\\ubfb9\\ubfba\\ubfbb\\ubfbc\\ubfbd\\ubfbe\\ubfbf\\ubfc0\\ubfc1\\ubfc2\\ubfc3\\ubfc4\\ubfc5\\ubfc6\\ubfc7\\ubfc8\\ubfc9\\ubfca\\ubfcb\\ubfcc\\ubfcd\\ubfce\\ubfcf\\ubfd0\\ubfd1\\ubfd2\\ubfd3\\ubfd4\\ubfd5\\ubfd6\\ubfd7\\ubfd8\\ubfd9\\ubfda\\ubfdb\\ubfdc\\ubfdd\\ubfde\\ubfdf\\ubfe0\\ubfe1\\ubfe2\\ubfe3\\ubfe4\\ubfe5\\ubfe6\\ubfe7\\ubfe8\\ubfe9\\ubfea\\ubfeb\\ubfec\\ubfed\\ubfee\\ubfef\\ubff0\\ubff1\\ubff2\\ubff3\\ubff4\\ubff5\\ubff6\\ubff7\\ubff8\\ubff9\\ubffa\\ubffb\\ubffc\\ubffd\\ubffe\\ubfff\\uc000\\uc001\\uc002\\uc003\\uc004\\uc005\\uc006\\uc007\\uc008\\uc009\\uc00a\\uc00b\\uc00c\\uc00d\\uc00e\\uc00f\\uc010\\uc011\\uc012\\uc013\\uc014\\uc015\\uc016\\uc017\\uc018\\uc019\\uc01a\\uc01b\\uc01c\\uc01d\\uc01e\\uc01f\\uc020\\uc021\\uc022\\uc023\\uc024\\uc025\\uc026\\uc027\\uc028\\uc029\\uc02a\\uc02b\\uc02c\\uc02d\\uc02e\\uc02f\\uc030\\uc031\\uc032\\uc033\\uc034\\uc035\\uc036\\uc037\\uc038\\uc039\\uc03a\\uc03b\\uc03c\\uc03d\\uc03e\\uc03f\\uc040\\uc041\\uc042\\uc043\\uc044\\uc045\\uc046\\uc047\\uc048\\uc049\\uc04a\\uc04b\\uc04c\\uc04d\\uc04e\\uc04f\\uc050\\uc051\\uc052\\uc053\\uc054\\uc055\\uc056\\uc057\\uc058\\uc059\\uc05a\\uc05b\\uc05c\\uc05d\\uc05e\\uc05f\\uc060\\uc061\\uc062\\uc063\\uc064\\uc065\\uc066\\uc067\\uc068\\uc069\\uc06a\\uc06b\\uc06c\\uc06d\\uc06e\\uc06f\\uc070\\uc071\\uc072\\uc073\\uc074\\uc075\\uc076\\uc077\\uc078\\uc079\\uc07a\\uc07b\\uc07c\\uc07d\\uc07e\\uc07f\\uc080\\uc081\\uc082\\uc083\\uc084\\uc085\\uc086\\uc087\\uc088\\uc089\\uc08a\\uc08b\\uc08c\\uc08d\\uc08e\\uc08f\\uc090\\uc091\\uc092\\uc093\\uc094\\uc095\\uc096\\uc097\\uc098\\uc099\\uc09a\\uc09b\\uc09c\\uc09d\\uc09e\\uc09f\\uc0a0\\uc0a1\\uc0a2\\uc0a3\\uc0a4\\uc0a5\\uc0a6\\uc0a7\\uc0a8\\uc0a9\\uc0aa\\uc0ab\\uc0ac\\uc0ad\\uc0ae\\uc0af\\uc0b0\\uc0b1\\uc0b2\\uc0b3\\uc0b4\\uc0b5\\uc0b6\\uc0b7\\uc0b8\\uc0b9\\uc0ba\\uc0bb\\uc0bc\\uc0bd\\uc0be\\uc0bf\\uc0c0\\uc0c1\\uc0c2\\uc0c3\\uc0c4\\uc0c5\\uc0c6\\uc0c7\\uc0c8\\uc0c9\\uc0ca\\uc0cb\\uc0cc\\uc0cd\\uc0ce\\uc0cf\\uc0d0\\uc0d1\\uc0d2\\uc0d3\\uc0d4\\uc0d5\\uc0d6\\uc0d7\\uc0d8\\uc0d9\\uc0da\\uc0db\\uc0dc\\uc0dd\\uc0de\\uc0df\\uc0e0\\uc0e1\\uc0e2\\uc0e3\\uc0e4\\uc0e5\\uc0e6\\uc0e7\\uc0e8\\uc0e9\\uc0ea\\uc0eb\\uc0ec\\uc0ed\\uc0ee\\uc0ef\\uc0f0\\uc0f1\\uc0f2\\uc0f3\\uc0f4\\uc0f5\\uc0f6\\uc0f7\\uc0f8\\uc0f9\\uc0fa\\uc0fb\\uc0fc\\uc0fd\\uc0fe\\uc0ff\\uc100\\uc101\\uc102\\uc103\\uc104\\uc105\\uc106\\uc107\\uc108\\uc109\\uc10a\\uc10b\\uc10c\\uc10d\\uc10e\\uc10f\\uc110\\uc111\\uc112\\uc113\\uc114\\uc115\\uc116\\uc117\\uc118\\uc119\\uc11a\\uc11b\\uc11c\\uc11d\\uc11e\\uc11f\\uc120\\uc121\\uc122\\uc123\\uc124\\uc125\\uc126\\uc127\\uc128\\uc129\\uc12a\\uc12b\\uc12c\\uc12d\\uc12e\\uc12f\\uc130\\uc131\\uc132\\uc133\\uc134\\uc135\\uc136\\uc137\\uc138\\uc139\\uc13a\\uc13b\\uc13c\\uc13d\\uc13e\\uc13f\\uc140\\uc141\\uc142\\uc143\\uc144\\uc145\\uc146\\uc147\\uc148\\uc149\\uc14a\\uc14b\\uc14c\\uc14d\\uc14e\\uc14f\\uc150\\uc151\\uc152\\uc153\\uc154\\uc155\\uc156\\uc157\\uc158\\uc159\\uc15a\\uc15b\\uc15c\\uc15d\\uc15e\\uc15f\\uc160\\uc161\\uc162\\uc163\\uc164\\uc165\\uc166\\uc167\\uc168\\uc169\\uc16a\\uc16b\\uc16c\\uc16d\\uc16e\\uc16f\\uc170\\uc171\\uc172\\uc173\\uc174\\uc175\\uc176\\uc177\\uc178\\uc179\\uc17a\\uc17b\\uc17c\\uc17d\\uc17e\\uc17f\\uc180\\uc181\\uc182\\uc183\\uc184\\uc185\\uc186\\uc187\\uc188\\uc189\\uc18a\\uc18b\\uc18c\\uc18d\\uc18e\\uc18f\\uc190\\uc191\\uc192\\uc193\\uc194\\uc195\\uc196\\uc197\\uc198\\uc199\\uc19a\\uc19b\\uc19c\\uc19d\\uc19e\\uc19f\\uc1a0\\uc1a1\\uc1a2\\uc1a3\\uc1a4\\uc1a5\\uc1a6\\uc1a7\\uc1a8\\uc1a9\\uc1aa\\uc1ab\\uc1ac\\uc1ad\\uc1ae\\uc1af\\uc1b0\\uc1b1\\uc1b2\\uc1b3\\uc1b4\\uc1b5\\uc1b6\\uc1b7\\uc1b8\\uc1b9\\uc1ba\\uc1bb\\uc1bc\\uc1bd\\uc1be\\uc1bf\\uc1c0\\uc1c1\\uc1c2\\uc1c3\\uc1c4\\uc1c5\\uc1c6\\uc1c7\\uc1c8\\uc1c9\\uc1ca\\uc1cb\\uc1cc\\uc1cd\\uc1ce\\uc1cf\\uc1d0\\uc1d1\\uc1d2\\uc1d3\\uc1d4\\uc1d5\\uc1d6\\uc1d7\\uc1d8\\uc1d9\\uc1da\\uc1db\\uc1dc\\uc1dd\\uc1de\\uc1df\\uc1e0\\uc1e1\\uc1e2\\uc1e3\\uc1e4\\uc1e5\\uc1e6\\uc1e7\\uc1e8\\uc1e9\\uc1ea\\uc1eb\\uc1ec\\uc1ed\\uc1ee\\uc1ef\\uc1f0\\uc1f1\\uc1f2\\uc1f3\\uc1f4\\uc1f5\\uc1f6\\uc1f7\\uc1f8\\uc1f9\\uc1fa\\uc1fb\\uc1fc\\uc1fd\\uc1fe\\uc1ff\\uc200\\uc201\\uc202\\uc203\\uc204\\uc205\\uc206\\uc207\\uc208\\uc209\\uc20a\\uc20b\\uc20c\\uc20d\\uc20e\\uc20f\\uc210\\uc211\\uc212\\uc213\\uc214\\uc215\\uc216\\uc217\\uc218\\uc219\\uc21a\\uc21b\\uc21c\\uc21d\\uc21e\\uc21f\\uc220\\uc221\\uc222\\uc223\\uc224\\uc225\\uc226\\uc227\\uc228\\uc229\\uc22a\\uc22b\\uc22c\\uc22d\\uc22e\\uc22f\\uc230\\uc231\\uc232\\uc233\\uc234\\uc235\\uc236\\uc237\\uc238\\uc239\\uc23a\\uc23b\\uc23c\\uc23d\\uc23e\\uc23f\\uc240\\uc241\\uc242\\uc243\\uc244\\uc245\\uc246\\uc247\\uc248\\uc249\\uc24a\\uc24b\\uc24c\\uc24d\\uc24e\\uc24f\\uc250\\uc251\\uc252\\uc253\\uc254\\uc255\\uc256\\uc257\\uc258\\uc259\\uc25a\\uc25b\\uc25c\\uc25d\\uc25e\\uc25f\\uc260\\uc261\\uc262\\uc263\\uc264\\uc265\\uc266\\uc267\\uc268\\uc269\\uc26a\\uc26b\\uc26c\\uc26d\\uc26e\\uc26f\\uc270\\uc271\\uc272\\uc273\\uc274\\uc275\\uc276\\uc277\\uc278\\uc279\\uc27a\\uc27b\\uc27c\\uc27d\\uc27e\\uc27f\\uc280\\uc281\\uc282\\uc283\\uc284\\uc285\\uc286\\uc287\\uc288\\uc289\\uc28a\\uc28b\\uc28c\\uc28d\\uc28e\\uc28f\\uc290\\uc291\\uc292\\uc293\\uc294\\uc295\\uc296\\uc297\\uc298\\uc299\\uc29a\\uc29b\\uc29c\\uc29d\\uc29e\\uc29f\\uc2a0\\uc2a1\\uc2a2\\uc2a3\\uc2a4\\uc2a5\\uc2a6\\uc2a7\\uc2a8\\uc2a9\\uc2aa\\uc2ab\\uc2ac\\uc2ad\\uc2ae\\uc2af\\uc2b0\\uc2b1\\uc2b2\\uc2b3\\uc2b4\\uc2b5\\uc2b6\\uc2b7\\uc2b8\\uc2b9\\uc2ba\\uc2bb\\uc2bc\\uc2bd\\uc2be\\uc2bf\\uc2c0\\uc2c1\\uc2c2\\uc2c3\\uc2c4\\uc2c5\\uc2c6\\uc2c7\\uc2c8\\uc2c9\\uc2ca\\uc2cb\\uc2cc\\uc2cd\\uc2ce\\uc2cf\\uc2d0\\uc2d1\\uc2d2\\uc2d3\\uc2d4\\uc2d5\\uc2d6\\uc2d7\\uc2d8\\uc2d9\\uc2da\\uc2db\\uc2dc\\uc2dd\\uc2de\\uc2df\\uc2e0\\uc2e1\\uc2e2\\uc2e3\\uc2e4\\uc2e5\\uc2e6\\uc2e7\\uc2e8\\uc2e9\\uc2ea\\uc2eb\\uc2ec\\uc2ed\\uc2ee\\uc2ef\\uc2f0\\uc2f1\\uc2f2\\uc2f3\\uc2f4\\uc2f5\\uc2f6\\uc2f7\\uc2f8\\uc2f9\\uc2fa\\uc2fb\\uc2fc\\uc2fd\\uc2fe\\uc2ff\\uc300\\uc301\\uc302\\uc303\\uc304\\uc305\\uc306\\uc307\\uc308\\uc309\\uc30a\\uc30b\\uc30c\\uc30d\\uc30e\\uc30f\\uc310\\uc311\\uc312\\uc313\\uc314\\uc315\\uc316\\uc317\\uc318\\uc319\\uc31a\\uc31b\\uc31c\\uc31d\\uc31e\\uc31f\\uc320\\uc321\\uc322\\uc323\\uc324\\uc325\\uc326\\uc327\\uc328\\uc329\\uc32a\\uc32b\\uc32c\\uc32d\\uc32e\\uc32f\\uc330\\uc331\\uc332\\uc333\\uc334\\uc335\\uc336\\uc337\\uc338\\uc339\\uc33a\\uc33b\\uc33c\\uc33d\\uc33e\\uc33f\\uc340\\uc341\\uc342\\uc343\\uc344\\uc345\\uc346\\uc347\\uc348\\uc349\\uc34a\\uc34b\\uc34c\\uc34d\\uc34e\\uc34f\\uc350\\uc351\\uc352\\uc353\\uc354\\uc355\\uc356\\uc357\\uc358\\uc359\\uc35a\\uc35b\\uc35c\\uc35d\\uc35e\\uc35f\\uc360\\uc361\\uc362\\uc363\\uc364\\uc365\\uc366\\uc367\\uc368\\uc369\\uc36a\\uc36b\\uc36c\\uc36d\\uc36e\\uc36f\\uc370\\uc371\\uc372\\uc373\\uc374\\uc375\\uc376\\uc377\\uc378\\uc379\\uc37a\\uc37b\\uc37c\\uc37d\\uc37e\\uc37f\\uc380\\uc381\\uc382\\uc383\\uc384\\uc385\\uc386\\uc387\\uc388\\uc389\\uc38a\\uc38b\\uc38c\\uc38d\\uc38e\\uc38f\\uc390\\uc391\\uc392\\uc393\\uc394\\uc395\\uc396\\uc397\\uc398\\uc399\\uc39a\\uc39b\\uc39c\\uc39d\\uc39e\\uc39f\\uc3a0\\uc3a1\\uc3a2\\uc3a3\\uc3a4\\uc3a5\\uc3a6\\uc3a7\\uc3a8\\uc3a9\\uc3aa\\uc3ab\\uc3ac\\uc3ad\\uc3ae\\uc3af\\uc3b0\\uc3b1\\uc3b2\\uc3b3\\uc3b4\\uc3b5\\uc3b6\\uc3b7\\uc3b8\\uc3b9\\uc3ba\\uc3bb\\uc3bc\\uc3bd\\uc3be\\uc3bf\\uc3c0\\uc3c1\\uc3c2\\uc3c3\\uc3c4\\uc3c5\\uc3c6\\uc3c7\\uc3c8\\uc3c9\\uc3ca\\uc3cb\\uc3cc\\uc3cd\\uc3ce\\uc3cf\\uc3d0\\uc3d1\\uc3d2\\uc3d3\\uc3d4\\uc3d5\\uc3d6\\uc3d7\\uc3d8\\uc3d9\\uc3da\\uc3db\\uc3dc\\uc3dd\\uc3de\\uc3df\\uc3e0\\uc3e1\\uc3e2\\uc3e3\\uc3e4\\uc3e5\\uc3e6\\uc3e7\\uc3e8\\uc3e9\\uc3ea\\uc3eb\\uc3ec\\uc3ed\\uc3ee\\uc3ef\\uc3f0\\uc3f1\\uc3f2\\uc3f3\\uc3f4\\uc3f5\\uc3f6\\uc3f7\\uc3f8\\uc3f9\\uc3fa\\uc3fb\\uc3fc\\uc3fd\\uc3fe\\uc3ff\\uc400\\uc401\\uc402\\uc403\\uc404\\uc405\\uc406\\uc407\\uc408\\uc409\\uc40a\\uc40b\\uc40c\\uc40d\\uc40e\\uc40f\\uc410\\uc411\\uc412\\uc413\\uc414\\uc415\\uc416\\uc417\\uc418\\uc419\\uc41a\\uc41b\\uc41c\\uc41d\\uc41e\\uc41f\\uc420\\uc421\\uc422\\uc423\\uc424\\uc425\\uc426\\uc427\\uc428\\uc429\\uc42a\\uc42b\\uc42c\\uc42d\\uc42e\\uc42f\\uc430\\uc431\\uc432\\uc433\\uc434\\uc435\\uc436\\uc437\\uc438\\uc439\\uc43a\\uc43b\\uc43c\\uc43d\\uc43e\\uc43f\\uc440\\uc441\\uc442\\uc443\\uc444\\uc445\\uc446\\uc447\\uc448\\uc449\\uc44a\\uc44b\\uc44c\\uc44d\\uc44e\\uc44f\\uc450\\uc451\\uc452\\uc453\\uc454\\uc455\\uc456\\uc457\\uc458\\uc459\\uc45a\\uc45b\\uc45c\\uc45d\\uc45e\\uc45f\\uc460\\uc461\\uc462\\uc463\\uc464\\uc465\\uc466\\uc467\\uc468\\uc469\\uc46a\\uc46b\\uc46c\\uc46d\\uc46e\\uc46f\\uc470\\uc471\\uc472\\uc473\\uc474\\uc475\\uc476\\uc477\\uc478\\uc479\\uc47a\\uc47b\\uc47c\\uc47d\\uc47e\\uc47f\\uc480\\uc481\\uc482\\uc483\\uc484\\uc485\\uc486\\uc487\\uc488\\uc489\\uc48a\\uc48b\\uc48c\\uc48d\\uc48e\\uc48f\\uc490\\uc491\\uc492\\uc493\\uc494\\uc495\\uc496\\uc497\\uc498\\uc499\\uc49a\\uc49b\\uc49c\\uc49d\\uc49e\\uc49f\\uc4a0\\uc4a1\\uc4a2\\uc4a3\\uc4a4\\uc4a5\\uc4a6\\uc4a7\\uc4a8\\uc4a9\\uc4aa\\uc4ab\\uc4ac\\uc4ad\\uc4ae\\uc4af\\uc4b0\\uc4b1\\uc4b2\\uc4b3\\uc4b4\\uc4b5\\uc4b6\\uc4b7\\uc4b8\\uc4b9\\uc4ba\\uc4bb\\uc4bc\\uc4bd\\uc4be\\uc4bf\\uc4c0\\uc4c1\\uc4c2\\uc4c3\\uc4c4\\uc4c5\\uc4c6\\uc4c7\\uc4c8\\uc4c9\\uc4ca\\uc4cb\\uc4cc\\uc4cd\\uc4ce\\uc4cf\\uc4d0\\uc4d1\\uc4d2\\uc4d3\\uc4d4\\uc4d5\\uc4d6\\uc4d7\\uc4d8\\uc4d9\\uc4da\\uc4db\\uc4dc\\uc4dd\\uc4de\\uc4df\\uc4e0\\uc4e1\\uc4e2\\uc4e3\\uc4e4\\uc4e5\\uc4e6\\uc4e7\\uc4e8\\uc4e9\\uc4ea\\uc4eb\\uc4ec\\uc4ed\\uc4ee\\uc4ef\\uc4f0\\uc4f1\\uc4f2\\uc4f3\\uc4f4\\uc4f5\\uc4f6\\uc4f7\\uc4f8\\uc4f9\\uc4fa\\uc4fb\\uc4fc\\uc4fd\\uc4fe\\uc4ff\\uc500\\uc501\\uc502\\uc503\\uc504\\uc505\\uc506\\uc507\\uc508\\uc509\\uc50a\\uc50b\\uc50c\\uc50d\\uc50e\\uc50f\\uc510\\uc511\\uc512\\uc513\\uc514\\uc515\\uc516\\uc517\\uc518\\uc519\\uc51a\\uc51b\\uc51c\\uc51d\\uc51e\\uc51f\\uc520\\uc521\\uc522\\uc523\\uc524\\uc525\\uc526\\uc527\\uc528\\uc529\\uc52a\\uc52b\\uc52c\\uc52d\\uc52e\\uc52f\\uc530\\uc531\\uc532\\uc533\\uc534\\uc535\\uc536\\uc537\\uc538\\uc539\\uc53a\\uc53b\\uc53c\\uc53d\\uc53e\\uc53f\\uc540\\uc541\\uc542\\uc543\\uc544\\uc545\\uc546\\uc547\\uc548\\uc549\\uc54a\\uc54b\\uc54c\\uc54d\\uc54e\\uc54f\\uc550\\uc551\\uc552\\uc553\\uc554\\uc555\\uc556\\uc557\\uc558\\uc559\\uc55a\\uc55b\\uc55c\\uc55d\\uc55e\\uc55f\\uc560\\uc561\\uc562\\uc563\\uc564\\uc565\\uc566\\uc567\\uc568\\uc569\\uc56a\\uc56b\\uc56c\\uc56d\\uc56e\\uc56f\\uc570\\uc571\\uc572\\uc573\\uc574\\uc575\\uc576\\uc577\\uc578\\uc579\\uc57a\\uc57b\\uc57c\\uc57d\\uc57e\\uc57f\\uc580\\uc581\\uc582\\uc583\\uc584\\uc585\\uc586\\uc587\\uc588\\uc589\\uc58a\\uc58b\\uc58c\\uc58d\\uc58e\\uc58f\\uc590\\uc591\\uc592\\uc593\\uc594\\uc595\\uc596\\uc597\\uc598\\uc599\\uc59a\\uc59b\\uc59c\\uc59d\\uc59e\\uc59f\\uc5a0\\uc5a1\\uc5a2\\uc5a3\\uc5a4\\uc5a5\\uc5a6\\uc5a7\\uc5a8\\uc5a9\\uc5aa\\uc5ab\\uc5ac\\uc5ad\\uc5ae\\uc5af\\uc5b0\\uc5b1\\uc5b2\\uc5b3\\uc5b4\\uc5b5\\uc5b6\\uc5b7\\uc5b8\\uc5b9\\uc5ba\\uc5bb\\uc5bc\\uc5bd\\uc5be\\uc5bf\\uc5c0\\uc5c1\\uc5c2\\uc5c3\\uc5c4\\uc5c5\\uc5c6\\uc5c7\\uc5c8\\uc5c9\\uc5ca\\uc5cb\\uc5cc\\uc5cd\\uc5ce\\uc5cf\\uc5d0\\uc5d1\\uc5d2\\uc5d3\\uc5d4\\uc5d5\\uc5d6\\uc5d7\\uc5d8\\uc5d9\\uc5da\\uc5db\\uc5dc\\uc5dd\\uc5de\\uc5df\\uc5e0\\uc5e1\\uc5e2\\uc5e3\\uc5e4\\uc5e5\\uc5e6\\uc5e7\\uc5e8\\uc5e9\\uc5ea\\uc5eb\\uc5ec\\uc5ed\\uc5ee\\uc5ef\\uc5f0\\uc5f1\\uc5f2\\uc5f3\\uc5f4\\uc5f5\\uc5f6\\uc5f7\\uc5f8\\uc5f9\\uc5fa\\uc5fb\\uc5fc\\uc5fd\\uc5fe\\uc5ff\\uc600\\uc601\\uc602\\uc603\\uc604\\uc605\\uc606\\uc607\\uc608\\uc609\\uc60a\\uc60b\\uc60c\\uc60d\\uc60e\\uc60f\\uc610\\uc611\\uc612\\uc613\\uc614\\uc615\\uc616\\uc617\\uc618\\uc619\\uc61a\\uc61b\\uc61c\\uc61d\\uc61e\\uc61f\\uc620\\uc621\\uc622\\uc623\\uc624\\uc625\\uc626\\uc627\\uc628\\uc629\\uc62a\\uc62b\\uc62c\\uc62d\\uc62e\\uc62f\\uc630\\uc631\\uc632\\uc633\\uc634\\uc635\\uc636\\uc637\\uc638\\uc639\\uc63a\\uc63b\\uc63c\\uc63d\\uc63e\\uc63f\\uc640\\uc641\\uc642\\uc643\\uc644\\uc645\\uc646\\uc647\\uc648\\uc649\\uc64a\\uc64b\\uc64c\\uc64d\\uc64e\\uc64f\\uc650\\uc651\\uc652\\uc653\\uc654\\uc655\\uc656\\uc657\\uc658\\uc659\\uc65a\\uc65b\\uc65c\\uc65d\\uc65e\\uc65f\\uc660\\uc661\\uc662\\uc663\\uc664\\uc665\\uc666\\uc667\\uc668\\uc669\\uc66a\\uc66b\\uc66c\\uc66d\\uc66e\\uc66f\\uc670\\uc671\\uc672\\uc673\\uc674\\uc675\\uc676\\uc677\\uc678\\uc679\\uc67a\\uc67b\\uc67c\\uc67d\\uc67e\\uc67f\\uc680\\uc681\\uc682\\uc683\\uc684\\uc685\\uc686\\uc687\\uc688\\uc689\\uc68a\\uc68b\\uc68c\\uc68d\\uc68e\\uc68f\\uc690\\uc691\\uc692\\uc693\\uc694\\uc695\\uc696\\uc697\\uc698\\uc699\\uc69a\\uc69b\\uc69c\\uc69d\\uc69e\\uc69f\\uc6a0\\uc6a1\\uc6a2\\uc6a3\\uc6a4\\uc6a5\\uc6a6\\uc6a7\\uc6a8\\uc6a9\\uc6aa\\uc6ab\\uc6ac\\uc6ad\\uc6ae\\uc6af\\uc6b0\\uc6b1\\uc6b2\\uc6b3\\uc6b4\\uc6b5\\uc6b6\\uc6b7\\uc6b8\\uc6b9\\uc6ba\\uc6bb\\uc6bc\\uc6bd\\uc6be\\uc6bf\\uc6c0\\uc6c1\\uc6c2\\uc6c3\\uc6c4\\uc6c5\\uc6c6\\uc6c7\\uc6c8\\uc6c9\\uc6ca\\uc6cb\\uc6cc\\uc6cd\\uc6ce\\uc6cf\\uc6d0\\uc6d1\\uc6d2\\uc6d3\\uc6d4\\uc6d5\\uc6d6\\uc6d7\\uc6d8\\uc6d9\\uc6da\\uc6db\\uc6dc\\uc6dd\\uc6de\\uc6df\\uc6e0\\uc6e1\\uc6e2\\uc6e3\\uc6e4\\uc6e5\\uc6e6\\uc6e7\\uc6e8\\uc6e9\\uc6ea\\uc6eb\\uc6ec\\uc6ed\\uc6ee\\uc6ef\\uc6f0\\uc6f1\\uc6f2\\uc6f3\\uc6f4\\uc6f5\\uc6f6\\uc6f7\\uc6f8\\uc6f9\\uc6fa\\uc6fb\\uc6fc\\uc6fd\\uc6fe\\uc6ff\\uc700\\uc701\\uc702\\uc703\\uc704\\uc705\\uc706\\uc707\\uc708\\uc709\\uc70a\\uc70b\\uc70c\\uc70d\\uc70e\\uc70f\\uc710\\uc711\\uc712\\uc713\\uc714\\uc715\\uc716\\uc717\\uc718\\uc719\\uc71a\\uc71b\\uc71c\\uc71d\\uc71e\\uc71f\\uc720\\uc721\\uc722\\uc723\\uc724\\uc725\\uc726\\uc727\\uc728\\uc729\\uc72a\\uc72b\\uc72c\\uc72d\\uc72e\\uc72f\\uc730\\uc731\\uc732\\uc733\\uc734\\uc735\\uc736\\uc737\\uc738\\uc739\\uc73a\\uc73b\\uc73c\\uc73d\\uc73e\\uc73f\\uc740\\uc741\\uc742\\uc743\\uc744\\uc745\\uc746\\uc747\\uc748\\uc749\\uc74a\\uc74b\\uc74c\\uc74d\\uc74e\\uc74f\\uc750\\uc751\\uc752\\uc753\\uc754\\uc755\\uc756\\uc757\\uc758\\uc759\\uc75a\\uc75b\\uc75c\\uc75d\\uc75e\\uc75f\\uc760\\uc761\\uc762\\uc763\\uc764\\uc765\\uc766\\uc767\\uc768\\uc769\\uc76a\\uc76b\\uc76c\\uc76d\\uc76e\\uc76f\\uc770\\uc771\\uc772\\uc773\\uc774\\uc775\\uc776\\uc777\\uc778\\uc779\\uc77a\\uc77b\\uc77c\\uc77d\\uc77e\\uc77f\\uc780\\uc781\\uc782\\uc783\\uc784\\uc785\\uc786\\uc787\\uc788\\uc789\\uc78a\\uc78b\\uc78c\\uc78d\\uc78e\\uc78f\\uc790\\uc791\\uc792\\uc793\\uc794\\uc795\\uc796\\uc797\\uc798\\uc799\\uc79a\\uc79b\\uc79c\\uc79d\\uc79e\\uc79f\\uc7a0\\uc7a1\\uc7a2\\uc7a3\\uc7a4\\uc7a5\\uc7a6\\uc7a7\\uc7a8\\uc7a9\\uc7aa\\uc7ab\\uc7ac\\uc7ad\\uc7ae\\uc7af\\uc7b0\\uc7b1\\uc7b2\\uc7b3\\uc7b4\\uc7b5\\uc7b6\\uc7b7\\uc7b8\\uc7b9\\uc7ba\\uc7bb\\uc7bc\\uc7bd\\uc7be\\uc7bf\\uc7c0\\uc7c1\\uc7c2\\uc7c3\\uc7c4\\uc7c5\\uc7c6\\uc7c7\\uc7c8\\uc7c9\\uc7ca\\uc7cb\\uc7cc\\uc7cd\\uc7ce\\uc7cf\\uc7d0\\uc7d1\\uc7d2\\uc7d3\\uc7d4\\uc7d5\\uc7d6\\uc7d7\\uc7d8\\uc7d9\\uc7da\\uc7db\\uc7dc\\uc7dd\\uc7de\\uc7df\\uc7e0\\uc7e1\\uc7e2\\uc7e3\\uc7e4\\uc7e5\\uc7e6\\uc7e7\\uc7e8\\uc7e9\\uc7ea\\uc7eb\\uc7ec\\uc7ed\\uc7ee\\uc7ef\\uc7f0\\uc7f1\\uc7f2\\uc7f3\\uc7f4\\uc7f5\\uc7f6\\uc7f7\\uc7f8\\uc7f9\\uc7fa\\uc7fb\\uc7fc\\uc7fd\\uc7fe\\uc7ff\\uc800\\uc801\\uc802\\uc803\\uc804\\uc805\\uc806\\uc807\\uc808\\uc809\\uc80a\\uc80b\\uc80c\\uc80d\\uc80e\\uc80f\\uc810\\uc811\\uc812\\uc813\\uc814\\uc815\\uc816\\uc817\\uc818\\uc819\\uc81a\\uc81b\\uc81c\\uc81d\\uc81e\\uc81f\\uc820\\uc821\\uc822\\uc823\\uc824\\uc825\\uc826\\uc827\\uc828\\uc829\\uc82a\\uc82b\\uc82c\\uc82d\\uc82e\\uc82f\\uc830\\uc831\\uc832\\uc833\\uc834\\uc835\\uc836\\uc837\\uc838\\uc839\\uc83a\\uc83b\\uc83c\\uc83d\\uc83e\\uc83f\\uc840\\uc841\\uc842\\uc843\\uc844\\uc845\\uc846\\uc847\\uc848\\uc849\\uc84a\\uc84b\\uc84c\\uc84d\\uc84e\\uc84f\\uc850\\uc851\\uc852\\uc853\\uc854\\uc855\\uc856\\uc857\\uc858\\uc859\\uc85a\\uc85b\\uc85c\\uc85d\\uc85e\\uc85f\\uc860\\uc861\\uc862\\uc863\\uc864\\uc865\\uc866\\uc867\\uc868\\uc869\\uc86a\\uc86b\\uc86c\\uc86d\\uc86e\\uc86f\\uc870\\uc871\\uc872\\uc873\\uc874\\uc875\\uc876\\uc877\\uc878\\uc879\\uc87a\\uc87b\\uc87c\\uc87d\\uc87e\\uc87f\\uc880\\uc881\\uc882\\uc883\\uc884\\uc885\\uc886\\uc887\\uc888\\uc889\\uc88a\\uc88b\\uc88c\\uc88d\\uc88e\\uc88f\\uc890\\uc891\\uc892\\uc893\\uc894\\uc895\\uc896\\uc897\\uc898\\uc899\\uc89a\\uc89b\\uc89c\\uc89d\\uc89e\\uc89f\\uc8a0\\uc8a1\\uc8a2\\uc8a3\\uc8a4\\uc8a5\\uc8a6\\uc8a7\\uc8a8\\uc8a9\\uc8aa\\uc8ab\\uc8ac\\uc8ad\\uc8ae\\uc8af\\uc8b0\\uc8b1\\uc8b2\\uc8b3\\uc8b4\\uc8b5\\uc8b6\\uc8b7\\uc8b8\\uc8b9\\uc8ba\\uc8bb\\uc8bc\\uc8bd\\uc8be\\uc8bf\\uc8c0\\uc8c1\\uc8c2\\uc8c3\\uc8c4\\uc8c5\\uc8c6\\uc8c7\\uc8c8\\uc8c9\\uc8ca\\uc8cb\\uc8cc\\uc8cd\\uc8ce\\uc8cf\\uc8d0\\uc8d1\\uc8d2\\uc8d3\\uc8d4\\uc8d5\\uc8d6\\uc8d7\\uc8d8\\uc8d9\\uc8da\\uc8db\\uc8dc\\uc8dd\\uc8de\\uc8df\\uc8e0\\uc8e1\\uc8e2\\uc8e3\\uc8e4\\uc8e5\\uc8e6\\uc8e7\\uc8e8\\uc8e9\\uc8ea\\uc8eb\\uc8ec\\uc8ed\\uc8ee\\uc8ef\\uc8f0\\uc8f1\\uc8f2\\uc8f3\\uc8f4\\uc8f5\\uc8f6\\uc8f7\\uc8f8\\uc8f9\\uc8fa\\uc8fb\\uc8fc\\uc8fd\\uc8fe\\uc8ff\\uc900\\uc901\\uc902\\uc903\\uc904\\uc905\\uc906\\uc907\\uc908\\uc909\\uc90a\\uc90b\\uc90c\\uc90d\\uc90e\\uc90f\\uc910\\uc911\\uc912\\uc913\\uc914\\uc915\\uc916\\uc917\\uc918\\uc919\\uc91a\\uc91b\\uc91c\\uc91d\\uc91e\\uc91f\\uc920\\uc921\\uc922\\uc923\\uc924\\uc925\\uc926\\uc927\\uc928\\uc929\\uc92a\\uc92b\\uc92c\\uc92d\\uc92e\\uc92f\\uc930\\uc931\\uc932\\uc933\\uc934\\uc935\\uc936\\uc937\\uc938\\uc939\\uc93a\\uc93b\\uc93c\\uc93d\\uc93e\\uc93f\\uc940\\uc941\\uc942\\uc943\\uc944\\uc945\\uc946\\uc947\\uc948\\uc949\\uc94a\\uc94b\\uc94c\\uc94d\\uc94e\\uc94f\\uc950\\uc951\\uc952\\uc953\\uc954\\uc955\\uc956\\uc957\\uc958\\uc959\\uc95a\\uc95b\\uc95c\\uc95d\\uc95e\\uc95f\\uc960\\uc961\\uc962\\uc963\\uc964\\uc965\\uc966\\uc967\\uc968\\uc969\\uc96a\\uc96b\\uc96c\\uc96d\\uc96e\\uc96f\\uc970\\uc971\\uc972\\uc973\\uc974\\uc975\\uc976\\uc977\\uc978\\uc979\\uc97a\\uc97b\\uc97c\\uc97d\\uc97e\\uc97f\\uc980\\uc981\\uc982\\uc983\\uc984\\uc985\\uc986\\uc987\\uc988\\uc989\\uc98a\\uc98b\\uc98c\\uc98d\\uc98e\\uc98f\\uc990\\uc991\\uc992\\uc993\\uc994\\uc995\\uc996\\uc997\\uc998\\uc999\\uc99a\\uc99b\\uc99c\\uc99d\\uc99e\\uc99f\\uc9a0\\uc9a1\\uc9a2\\uc9a3\\uc9a4\\uc9a5\\uc9a6\\uc9a7\\uc9a8\\uc9a9\\uc9aa\\uc9ab\\uc9ac\\uc9ad\\uc9ae\\uc9af\\uc9b0\\uc9b1\\uc9b2\\uc9b3\\uc9b4\\uc9b5\\uc9b6\\uc9b7\\uc9b8\\uc9b9\\uc9ba\\uc9bb\\uc9bc\\uc9bd\\uc9be\\uc9bf\\uc9c0\\uc9c1\\uc9c2\\uc9c3\\uc9c4\\uc9c5\\uc9c6\\uc9c7\\uc9c8\\uc9c9\\uc9ca\\uc9cb\\uc9cc\\uc9cd\\uc9ce\\uc9cf\\uc9d0\\uc9d1\\uc9d2\\uc9d3\\uc9d4\\uc9d5\\uc9d6\\uc9d7\\uc9d8\\uc9d9\\uc9da\\uc9db\\uc9dc\\uc9dd\\uc9de\\uc9df\\uc9e0\\uc9e1\\uc9e2\\uc9e3\\uc9e4\\uc9e5\\uc9e6\\uc9e7\\uc9e8\\uc9e9\\uc9ea\\uc9eb\\uc9ec\\uc9ed\\uc9ee\\uc9ef\\uc9f0\\uc9f1\\uc9f2\\uc9f3\\uc9f4\\uc9f5\\uc9f6\\uc9f7\\uc9f8\\uc9f9\\uc9fa\\uc9fb\\uc9fc\\uc9fd\\uc9fe\\uc9ff\\uca00\\uca01\\uca02\\uca03\\uca04\\uca05\\uca06\\uca07\\uca08\\uca09\\uca0a\\uca0b\\uca0c\\uca0d\\uca0e\\uca0f\\uca10\\uca11\\uca12\\uca13\\uca14\\uca15\\uca16\\uca17\\uca18\\uca19\\uca1a\\uca1b\\uca1c\\uca1d\\uca1e\\uca1f\\uca20\\uca21\\uca22\\uca23\\uca24\\uca25\\uca26\\uca27\\uca28\\uca29\\uca2a\\uca2b\\uca2c\\uca2d\\uca2e\\uca2f\\uca30\\uca31\\uca32\\uca33\\uca34\\uca35\\uca36\\uca37\\uca38\\uca39\\uca3a\\uca3b\\uca3c\\uca3d\\uca3e\\uca3f\\uca40\\uca41\\uca42\\uca43\\uca44\\uca45\\uca46\\uca47\\uca48\\uca49\\uca4a\\uca4b\\uca4c\\uca4d\\uca4e\\uca4f\\uca50\\uca51\\uca52\\uca53\\uca54\\uca55\\uca56\\uca57\\uca58\\uca59\\uca5a\\uca5b\\uca5c\\uca5d\\uca5e\\uca5f\\uca60\\uca61\\uca62\\uca63\\uca64\\uca65\\uca66\\uca67\\uca68\\uca69\\uca6a\\uca6b\\uca6c\\uca6d\\uca6e\\uca6f\\uca70\\uca71\\uca72\\uca73\\uca74\\uca75\\uca76\\uca77\\uca78\\uca79\\uca7a\\uca7b\\uca7c\\uca7d\\uca7e\\uca7f\\uca80\\uca81\\uca82\\uca83\\uca84\\uca85\\uca86\\uca87\\uca88\\uca89\\uca8a\\uca8b\\uca8c\\uca8d\\uca8e\\uca8f\\uca90\\uca91\\uca92\\uca93\\uca94\\uca95\\uca96\\uca97\\uca98\\uca99\\uca9a\\uca9b\\uca9c\\uca9d\\uca9e\\uca9f\\ucaa0\\ucaa1\\ucaa2\\ucaa3\\ucaa4\\ucaa5\\ucaa6\\ucaa7\\ucaa8\\ucaa9\\ucaaa\\ucaab\\ucaac\\ucaad\\ucaae\\ucaaf\\ucab0\\ucab1\\ucab2\\ucab3\\ucab4\\ucab5\\ucab6\\ucab7\\ucab8\\ucab9\\ucaba\\ucabb\\ucabc\\ucabd\\ucabe\\ucabf\\ucac0\\ucac1\\ucac2\\ucac3\\ucac4\\ucac5\\ucac6\\ucac7\\ucac8\\ucac9\\ucaca\\ucacb\\ucacc\\ucacd\\ucace\\ucacf\\ucad0\\ucad1\\ucad2\\ucad3\\ucad4\\ucad5\\ucad6\\ucad7\\ucad8\\ucad9\\ucada\\ucadb\\ucadc\\ucadd\\ucade\\ucadf\\ucae0\\ucae1\\ucae2\\ucae3\\ucae4\\ucae5\\ucae6\\ucae7\\ucae8\\ucae9\\ucaea\\ucaeb\\ucaec\\ucaed\\ucaee\\ucaef\\ucaf0\\ucaf1\\ucaf2\\ucaf3\\ucaf4\\ucaf5\\ucaf6\\ucaf7\\ucaf8\\ucaf9\\ucafa\\ucafb\\ucafc\\ucafd\\ucafe\\ucaff\\ucb00\\ucb01\\ucb02\\ucb03\\ucb04\\ucb05\\ucb06\\ucb07\\ucb08\\ucb09\\ucb0a\\ucb0b\\ucb0c\\ucb0d\\ucb0e\\ucb0f\\ucb10\\ucb11\\ucb12\\ucb13\\ucb14\\ucb15\\ucb16\\ucb17\\ucb18\\ucb19\\ucb1a\\ucb1b\\ucb1c\\ucb1d\\ucb1e\\ucb1f\\ucb20\\ucb21\\ucb22\\ucb23\\ucb24\\ucb25\\ucb26\\ucb27\\ucb28\\ucb29\\ucb2a\\ucb2b\\ucb2c\\ucb2d\\ucb2e\\ucb2f\\ucb30\\ucb31\\ucb32\\ucb33\\ucb34\\ucb35\\ucb36\\ucb37\\ucb38\\ucb39\\ucb3a\\ucb3b\\ucb3c\\ucb3d\\ucb3e\\ucb3f\\ucb40\\ucb41\\ucb42\\ucb43\\ucb44\\ucb45\\ucb46\\ucb47\\ucb48\\ucb49\\ucb4a\\ucb4b\\ucb4c\\ucb4d\\ucb4e\\ucb4f\\ucb50\\ucb51\\ucb52\\ucb53\\ucb54\\ucb55\\ucb56\\ucb57\\ucb58\\ucb59\\ucb5a\\ucb5b\\ucb5c\\ucb5d\\ucb5e\\ucb5f\\ucb60\\ucb61\\ucb62\\ucb63\\ucb64\\ucb65\\ucb66\\ucb67\\ucb68\\ucb69\\ucb6a\\ucb6b\\ucb6c\\ucb6d\\ucb6e\\ucb6f\\ucb70\\ucb71\\ucb72\\ucb73\\ucb74\\ucb75\\ucb76\\ucb77\\ucb78\\ucb79\\ucb7a\\ucb7b\\ucb7c\\ucb7d\\ucb7e\\ucb7f\\ucb80\\ucb81\\ucb82\\ucb83\\ucb84\\ucb85\\ucb86\\ucb87\\ucb88\\ucb89\\ucb8a\\ucb8b\\ucb8c\\ucb8d\\ucb8e\\ucb8f\\ucb90\\ucb91\\ucb92\\ucb93\\ucb94\\ucb95\\ucb96\\ucb97\\ucb98\\ucb99\\ucb9a\\ucb9b\\ucb9c\\ucb9d\\ucb9e\\ucb9f\\ucba0\\ucba1\\ucba2\\ucba3\\ucba4\\ucba5\\ucba6\\ucba7\\ucba8\\ucba9\\ucbaa\\ucbab\\ucbac\\ucbad\\ucbae\\ucbaf\\ucbb0\\ucbb1\\ucbb2\\ucbb3\\ucbb4\\ucbb5\\ucbb6\\ucbb7\\ucbb8\\ucbb9\\ucbba\\ucbbb\\ucbbc\\ucbbd\\ucbbe\\ucbbf\\ucbc0\\ucbc1\\ucbc2\\ucbc3\\ucbc4\\ucbc5\\ucbc6\\ucbc7\\ucbc8\\ucbc9\\ucbca\\ucbcb\\ucbcc\\ucbcd\\ucbce\\ucbcf\\ucbd0\\ucbd1\\ucbd2\\ucbd3\\ucbd4\\ucbd5\\ucbd6\\ucbd7\\ucbd8\\ucbd9\\ucbda\\ucbdb\\ucbdc\\ucbdd\\ucbde\\ucbdf\\ucbe0\\ucbe1\\ucbe2\\ucbe3\\ucbe4\\ucbe5\\ucbe6\\ucbe7\\ucbe8\\ucbe9\\ucbea\\ucbeb\\ucbec\\ucbed\\ucbee\\ucbef\\ucbf0\\ucbf1\\ucbf2\\ucbf3\\ucbf4\\ucbf5\\ucbf6\\ucbf7\\ucbf8\\ucbf9\\ucbfa\\ucbfb\\ucbfc\\ucbfd\\ucbfe\\ucbff\\ucc00\\ucc01\\ucc02\\ucc03\\ucc04\\ucc05\\ucc06\\ucc07\\ucc08\\ucc09\\ucc0a\\ucc0b\\ucc0c\\ucc0d\\ucc0e\\ucc0f\\ucc10\\ucc11\\ucc12\\ucc13\\ucc14\\ucc15\\ucc16\\ucc17\\ucc18\\ucc19\\ucc1a\\ucc1b\\ucc1c\\ucc1d\\ucc1e\\ucc1f\\ucc20\\ucc21\\ucc22\\ucc23\\ucc24\\ucc25\\ucc26\\ucc27\\ucc28\\ucc29\\ucc2a\\ucc2b\\ucc2c\\ucc2d\\ucc2e\\ucc2f\\ucc30\\ucc31\\ucc32\\ucc33\\ucc34\\ucc35\\ucc36\\ucc37\\ucc38\\ucc39\\ucc3a\\ucc3b\\ucc3c\\ucc3d\\ucc3e\\ucc3f\\ucc40\\ucc41\\ucc42\\ucc43\\ucc44\\ucc45\\ucc46\\ucc47\\ucc48\\ucc49\\ucc4a\\ucc4b\\ucc4c\\ucc4d\\ucc4e\\ucc4f\\ucc50\\ucc51\\ucc52\\ucc53\\ucc54\\ucc55\\ucc56\\ucc57\\ucc58\\ucc59\\ucc5a\\ucc5b\\ucc5c\\ucc5d\\ucc5e\\ucc5f\\ucc60\\ucc61\\ucc62\\ucc63\\ucc64\\ucc65\\ucc66\\ucc67\\ucc68\\ucc69\\ucc6a\\ucc6b\\ucc6c\\ucc6d\\ucc6e\\ucc6f\\ucc70\\ucc71\\ucc72\\ucc73\\ucc74\\ucc75\\ucc76\\ucc77\\ucc78\\ucc79\\ucc7a\\ucc7b\\ucc7c\\ucc7d\\ucc7e\\ucc7f\\ucc80\\ucc81\\ucc82\\ucc83\\ucc84\\ucc85\\ucc86\\ucc87\\ucc88\\ucc89\\ucc8a\\ucc8b\\ucc8c\\ucc8d\\ucc8e\\ucc8f\\ucc90\\ucc91\\ucc92\\ucc93\\ucc94\\ucc95\\ucc96\\ucc97\\ucc98\\ucc99\\ucc9a\\ucc9b\\ucc9c\\ucc9d\\ucc9e\\ucc9f\\ucca0\\ucca1\\ucca2\\ucca3\\ucca4\\ucca5\\ucca6\\ucca7\\ucca8\\ucca9\\uccaa\\uccab\\uccac\\uccad\\uccae\\uccaf\\uccb0\\uccb1\\uccb2\\uccb3\\uccb4\\uccb5\\uccb6\\uccb7\\uccb8\\uccb9\\uccba\\uccbb\\uccbc\\uccbd\\uccbe\\uccbf\\uccc0\\uccc1\\uccc2\\uccc3\\uccc4\\uccc5\\uccc6\\uccc7\\uccc8\\uccc9\\uccca\\ucccb\\ucccc\\ucccd\\uccce\\ucccf\\uccd0\\uccd1\\uccd2\\uccd3\\uccd4\\uccd5\\uccd6\\uccd7\\uccd8\\uccd9\\uccda\\uccdb\\uccdc\\uccdd\\uccde\\uccdf\\ucce0\\ucce1\\ucce2\\ucce3\\ucce4\\ucce5\\ucce6\\ucce7\\ucce8\\ucce9\\uccea\\ucceb\\uccec\\ucced\\uccee\\uccef\\uccf0\\uccf1\\uccf2\\uccf3\\uccf4\\uccf5\\uccf6\\uccf7\\uccf8\\uccf9\\uccfa\\uccfb\\uccfc\\uccfd\\uccfe\\uccff\\ucd00\\ucd01\\ucd02\\ucd03\\ucd04\\ucd05\\ucd06\\ucd07\\ucd08\\ucd09\\ucd0a\\ucd0b\\ucd0c\\ucd0d\\ucd0e\\ucd0f\\ucd10\\ucd11\\ucd12\\ucd13\\ucd14\\ucd15\\ucd16\\ucd17\\ucd18\\ucd19\\ucd1a\\ucd1b\\ucd1c\\ucd1d\\ucd1e\\ucd1f\\ucd20\\ucd21\\ucd22\\ucd23\\ucd24\\ucd25\\ucd26\\ucd27\\ucd28\\ucd29\\ucd2a\\ucd2b\\ucd2c\\ucd2d\\ucd2e\\ucd2f\\ucd30\\ucd31\\ucd32\\ucd33\\ucd34\\ucd35\\ucd36\\ucd37\\ucd38\\ucd39\\ucd3a\\ucd3b\\ucd3c\\ucd3d\\ucd3e\\ucd3f\\ucd40\\ucd41\\ucd42\\ucd43\\ucd44\\ucd45\\ucd46\\ucd47\\ucd48\\ucd49\\ucd4a\\ucd4b\\ucd4c\\ucd4d\\ucd4e\\ucd4f\\ucd50\\ucd51\\ucd52\\ucd53\\ucd54\\ucd55\\ucd56\\ucd57\\ucd58\\ucd59\\ucd5a\\ucd5b\\ucd5c\\ucd5d\\ucd5e\\ucd5f\\ucd60\\ucd61\\ucd62\\ucd63\\ucd64\\ucd65\\ucd66\\ucd67\\ucd68\\ucd69\\ucd6a\\ucd6b\\ucd6c\\ucd6d\\ucd6e\\ucd6f\\ucd70\\ucd71\\ucd72\\ucd73\\ucd74\\ucd75\\ucd76\\ucd77\\ucd78\\ucd79\\ucd7a\\ucd7b\\ucd7c\\ucd7d\\ucd7e\\ucd7f\\ucd80\\ucd81\\ucd82\\ucd83\\ucd84\\ucd85\\ucd86\\ucd87\\ucd88\\ucd89\\ucd8a\\ucd8b\\ucd8c\\ucd8d\\ucd8e\\ucd8f\\ucd90\\ucd91\\ucd92\\ucd93\\ucd94\\ucd95\\ucd96\\ucd97\\ucd98\\ucd99\\ucd9a\\ucd9b\\ucd9c\\ucd9d\\ucd9e\\ucd9f\\ucda0\\ucda1\\ucda2\\ucda3\\ucda4\\ucda5\\ucda6\\ucda7\\ucda8\\ucda9\\ucdaa\\ucdab\\ucdac\\ucdad\\ucdae\\ucdaf\\ucdb0\\ucdb1\\ucdb2\\ucdb3\\ucdb4\\ucdb5\\ucdb6\\ucdb7\\ucdb8\\ucdb9\\ucdba\\ucdbb\\ucdbc\\ucdbd\\ucdbe\\ucdbf\\ucdc0\\ucdc1\\ucdc2\\ucdc3\\ucdc4\\ucdc5\\ucdc6\\ucdc7\\ucdc8\\ucdc9\\ucdca\\ucdcb\\ucdcc\\ucdcd\\ucdce\\ucdcf\\ucdd0\\ucdd1\\ucdd2\\ucdd3\\ucdd4\\ucdd5\\ucdd6\\ucdd7\\ucdd8\\ucdd9\\ucdda\\ucddb\\ucddc\\ucddd\\ucdde\\ucddf\\ucde0\\ucde1\\ucde2\\ucde3\\ucde4\\ucde5\\ucde6\\ucde7\\ucde8\\ucde9\\ucdea\\ucdeb\\ucdec\\ucded\\ucdee\\ucdef\\ucdf0\\ucdf1\\ucdf2\\ucdf3\\ucdf4\\ucdf5\\ucdf6\\ucdf7\\ucdf8\\ucdf9\\ucdfa\\ucdfb\\ucdfc\\ucdfd\\ucdfe\\ucdff\\uce00\\uce01\\uce02\\uce03\\uce04\\uce05\\uce06\\uce07\\uce08\\uce09\\uce0a\\uce0b\\uce0c\\uce0d\\uce0e\\uce0f\\uce10\\uce11\\uce12\\uce13\\uce14\\uce15\\uce16\\uce17\\uce18\\uce19\\uce1a\\uce1b\\uce1c\\uce1d\\uce1e\\uce1f\\uce20\\uce21\\uce22\\uce23\\uce24\\uce25\\uce26\\uce27\\uce28\\uce29\\uce2a\\uce2b\\uce2c\\uce2d\\uce2e\\uce2f\\uce30\\uce31\\uce32\\uce33\\uce34\\uce35\\uce36\\uce37\\uce38\\uce39\\uce3a\\uce3b\\uce3c\\uce3d\\uce3e\\uce3f\\uce40\\uce41\\uce42\\uce43\\uce44\\uce45\\uce46\\uce47\\uce48\\uce49\\uce4a\\uce4b\\uce4c\\uce4d\\uce4e\\uce4f\\uce50\\uce51\\uce52\\uce53\\uce54\\uce55\\uce56\\uce57\\uce58\\uce59\\uce5a\\uce5b\\uce5c\\uce5d\\uce5e\\uce5f\\uce60\\uce61\\uce62\\uce63\\uce64\\uce65\\uce66\\uce67\\uce68\\uce69\\uce6a\\uce6b\\uce6c\\uce6d\\uce6e\\uce6f\\uce70\\uce71\\uce72\\uce73\\uce74\\uce75\\uce76\\uce77\\uce78\\uce79\\uce7a\\uce7b\\uce7c\\uce7d\\uce7e\\uce7f\\uce80\\uce81\\uce82\\uce83\\uce84\\uce85\\uce86\\uce87\\uce88\\uce89\\uce8a\\uce8b\\uce8c\\uce8d\\uce8e\\uce8f\\uce90\\uce91\\uce92\\uce93\\uce94\\uce95\\uce96\\uce97\\uce98\\uce99\\uce9a\\uce9b\\uce9c\\uce9d\\uce9e\\uce9f\\ucea0\\ucea1\\ucea2\\ucea3\\ucea4\\ucea5\\ucea6\\ucea7\\ucea8\\ucea9\\uceaa\\uceab\\uceac\\ucead\\uceae\\uceaf\\uceb0\\uceb1\\uceb2\\uceb3\\uceb4\\uceb5\\uceb6\\uceb7\\uceb8\\uceb9\\uceba\\ucebb\\ucebc\\ucebd\\ucebe\\ucebf\\ucec0\\ucec1\\ucec2\\ucec3\\ucec4\\ucec5\\ucec6\\ucec7\\ucec8\\ucec9\\uceca\\ucecb\\ucecc\\ucecd\\ucece\\ucecf\\uced0\\uced1\\uced2\\uced3\\uced4\\uced5\\uced6\\uced7\\uced8\\uced9\\uceda\\ucedb\\ucedc\\ucedd\\ucede\\ucedf\\ucee0\\ucee1\\ucee2\\ucee3\\ucee4\\ucee5\\ucee6\\ucee7\\ucee8\\ucee9\\uceea\\uceeb\\uceec\\uceed\\uceee\\uceef\\ucef0\\ucef1\\ucef2\\ucef3\\ucef4\\ucef5\\ucef6\\ucef7\\ucef8\\ucef9\\ucefa\\ucefb\\ucefc\\ucefd\\ucefe\\uceff\\ucf00\\ucf01\\ucf02\\ucf03\\ucf04\\ucf05\\ucf06\\ucf07\\ucf08\\ucf09\\ucf0a\\ucf0b\\ucf0c\\ucf0d\\ucf0e\\ucf0f\\ucf10\\ucf11\\ucf12\\ucf13\\ucf14\\ucf15\\ucf16\\ucf17\\ucf18\\ucf19\\ucf1a\\ucf1b\\ucf1c\\ucf1d\\ucf1e\\ucf1f\\ucf20\\ucf21\\ucf22\\ucf23\\ucf24\\ucf25\\ucf26\\ucf27\\ucf28\\ucf29\\ucf2a\\ucf2b\\ucf2c\\ucf2d\\ucf2e\\ucf2f\\ucf30\\ucf31\\ucf32\\ucf33\\ucf34\\ucf35\\ucf36\\ucf37\\ucf38\\ucf39\\ucf3a\\ucf3b\\ucf3c\\ucf3d\\ucf3e\\ucf3f\\ucf40\\ucf41\\ucf42\\ucf43\\ucf44\\ucf45\\ucf46\\ucf47\\ucf48\\ucf49\\ucf4a\\ucf4b\\ucf4c\\ucf4d\\ucf4e\\ucf4f\\ucf50\\ucf51\\ucf52\\ucf53\\ucf54\\ucf55\\ucf56\\ucf57\\ucf58\\ucf59\\ucf5a\\ucf5b\\ucf5c\\ucf5d\\ucf5e\\ucf5f\\ucf60\\ucf61\\ucf62\\ucf63\\ucf64\\ucf65\\ucf66\\ucf67\\ucf68\\ucf69\\ucf6a\\ucf6b\\ucf6c\\ucf6d\\ucf6e\\ucf6f\\ucf70\\ucf71\\ucf72\\ucf73\\ucf74\\ucf75\\ucf76\\ucf77\\ucf78\\ucf79\\ucf7a\\ucf7b\\ucf7c\\ucf7d\\ucf7e\\ucf7f\\ucf80\\ucf81\\ucf82\\ucf83\\ucf84\\ucf85\\ucf86\\ucf87\\ucf88\\ucf89\\ucf8a\\ucf8b\\ucf8c\\ucf8d\\ucf8e\\ucf8f\\ucf90\\ucf91\\ucf92\\ucf93\\ucf94\\ucf95\\ucf96\\ucf97\\ucf98\\ucf99\\ucf9a\\ucf9b\\ucf9c\\ucf9d\\ucf9e\\ucf9f\\ucfa0\\ucfa1\\ucfa2\\ucfa3\\ucfa4\\ucfa5\\ucfa6\\ucfa7\\ucfa8\\ucfa9\\ucfaa\\ucfab\\ucfac\\ucfad\\ucfae\\ucfaf\\ucfb0\\ucfb1\\ucfb2\\ucfb3\\ucfb4\\ucfb5\\ucfb6\\ucfb7\\ucfb8\\ucfb9\\ucfba\\ucfbb\\ucfbc\\ucfbd\\ucfbe\\ucfbf\\ucfc0\\ucfc1\\ucfc2\\ucfc3\\ucfc4\\ucfc5\\ucfc6\\ucfc7\\ucfc8\\ucfc9\\ucfca\\ucfcb\\ucfcc\\ucfcd\\ucfce\\ucfcf\\ucfd0\\ucfd1\\ucfd2\\ucfd3\\ucfd4\\ucfd5\\ucfd6\\ucfd7\\ucfd8\\ucfd9\\ucfda\\ucfdb\\ucfdc\\ucfdd\\ucfde\\ucfdf\\ucfe0\\ucfe1\\ucfe2\\ucfe3\\ucfe4\\ucfe5\\ucfe6\\ucfe7\\ucfe8\\ucfe9\\ucfea\\ucfeb\\ucfec\\ucfed\\ucfee\\ucfef\\ucff0\\ucff1\\ucff2\\ucff3\\ucff4\\ucff5\\ucff6\\ucff7\\ucff8\\ucff9\\ucffa\\ucffb\\ucffc\\ucffd\\ucffe\\ucfff\\ud000\\ud001\\ud002\\ud003\\ud004\\ud005\\ud006\\ud007\\ud008\\ud009\\ud00a\\ud00b\\ud00c\\ud00d\\ud00e\\ud00f\\ud010\\ud011\\ud012\\ud013\\ud014\\ud015\\ud016\\ud017\\ud018\\ud019\\ud01a\\ud01b\\ud01c\\ud01d\\ud01e\\ud01f\\ud020\\ud021\\ud022\\ud023\\ud024\\ud025\\ud026\\ud027\\ud028\\ud029\\ud02a\\ud02b\\ud02c\\ud02d\\ud02e\\ud02f\\ud030\\ud031\\ud032\\ud033\\ud034\\ud035\\ud036\\ud037\\ud038\\ud039\\ud03a\\ud03b\\ud03c\\ud03d\\ud03e\\ud03f\\ud040\\ud041\\ud042\\ud043\\ud044\\ud045\\ud046\\ud047\\ud048\\ud049\\ud04a\\ud04b\\ud04c\\ud04d\\ud04e\\ud04f\\ud050\\ud051\\ud052\\ud053\\ud054\\ud055\\ud056\\ud057\\ud058\\ud059\\ud05a\\ud05b\\ud05c\\ud05d\\ud05e\\ud05f\\ud060\\ud061\\ud062\\ud063\\ud064\\ud065\\ud066\\ud067\\ud068\\ud069\\ud06a\\ud06b\\ud06c\\ud06d\\ud06e\\ud06f\\ud070\\ud071\\ud072\\ud073\\ud074\\ud075\\ud076\\ud077\\ud078\\ud079\\ud07a\\ud07b\\ud07c\\ud07d\\ud07e\\ud07f\\ud080\\ud081\\ud082\\ud083\\ud084\\ud085\\ud086\\ud087\\ud088\\ud089\\ud08a\\ud08b\\ud08c\\ud08d\\ud08e\\ud08f\\ud090\\ud091\\ud092\\ud093\\ud094\\ud095\\ud096\\ud097\\ud098\\ud099\\ud09a\\ud09b\\ud09c\\ud09d\\ud09e\\ud09f\\ud0a0\\ud0a1\\ud0a2\\ud0a3\\ud0a4\\ud0a5\\ud0a6\\ud0a7\\ud0a8\\ud0a9\\ud0aa\\ud0ab\\ud0ac\\ud0ad\\ud0ae\\ud0af\\ud0b0\\ud0b1\\ud0b2\\ud0b3\\ud0b4\\ud0b5\\ud0b6\\ud0b7\\ud0b8\\ud0b9\\ud0ba\\ud0bb\\ud0bc\\ud0bd\\ud0be\\ud0bf\\ud0c0\\ud0c1\\ud0c2\\ud0c3\\ud0c4\\ud0c5\\ud0c6\\ud0c7\\ud0c8\\ud0c9\\ud0ca\\ud0cb\\ud0cc\\ud0cd\\ud0ce\\ud0cf\\ud0d0\\ud0d1\\ud0d2\\ud0d3\\ud0d4\\ud0d5\\ud0d6\\ud0d7\\ud0d8\\ud0d9\\ud0da\\ud0db\\ud0dc\\ud0dd\\ud0de\\ud0df\\ud0e0\\ud0e1\\ud0e2\\ud0e3\\ud0e4\\ud0e5\\ud0e6\\ud0e7\\ud0e8\\ud0e9\\ud0ea\\ud0eb\\ud0ec\\ud0ed\\ud0ee\\ud0ef\\ud0f0\\ud0f1\\ud0f2\\ud0f3\\ud0f4\\ud0f5\\ud0f6\\ud0f7\\ud0f8\\ud0f9\\ud0fa\\ud0fb\\ud0fc\\ud0fd\\ud0fe\\ud0ff\\ud100\\ud101\\ud102\\ud103\\ud104\\ud105\\ud106\\ud107\\ud108\\ud109\\ud10a\\ud10b\\ud10c\\ud10d\\ud10e\\ud10f\\ud110\\ud111\\ud112\\ud113\\ud114\\ud115\\ud116\\ud117\\ud118\\ud119\\ud11a\\ud11b\\ud11c\\ud11d\\ud11e\\ud11f\\ud120\\ud121\\ud122\\ud123\\ud124\\ud125\\ud126\\ud127\\ud128\\ud129\\ud12a\\ud12b\\ud12c\\ud12d\\ud12e\\ud12f\\ud130\\ud131\\ud132\\ud133\\ud134\\ud135\\ud136\\ud137\\ud138\\ud139\\ud13a\\ud13b\\ud13c\\ud13d\\ud13e\\ud13f\\ud140\\ud141\\ud142\\ud143\\ud144\\ud145\\ud146\\ud147\\ud148\\ud149\\ud14a\\ud14b\\ud14c\\ud14d\\ud14e\\ud14f\\ud150\\ud151\\ud152\\ud153\\ud154\\ud155\\ud156\\ud157\\ud158\\ud159\\ud15a\\ud15b\\ud15c\\ud15d\\ud15e\\ud15f\\ud160\\ud161\\ud162\\ud163\\ud164\\ud165\\ud166\\ud167\\ud168\\ud169\\ud16a\\ud16b\\ud16c\\ud16d\\ud16e\\ud16f\\ud170\\ud171\\ud172\\ud173\\ud174\\ud175\\ud176\\ud177\\ud178\\ud179\\ud17a\\ud17b\\ud17c\\ud17d\\ud17e\\ud17f\\ud180\\ud181\\ud182\\ud183\\ud184\\ud185\\ud186\\ud187\\ud188\\ud189\\ud18a\\ud18b\\ud18c\\ud18d\\ud18e\\ud18f\\ud190\\ud191\\ud192\\ud193\\ud194\\ud195\\ud196\\ud197\\ud198\\ud199\\ud19a\\ud19b\\ud19c\\ud19d\\ud19e\\ud19f\\ud1a0\\ud1a1\\ud1a2\\ud1a3\\ud1a4\\ud1a5\\ud1a6\\ud1a7\\ud1a8\\ud1a9\\ud1aa\\ud1ab\\ud1ac\\ud1ad\\ud1ae\\ud1af\\ud1b0\\ud1b1\\ud1b2\\ud1b3\\ud1b4\\ud1b5\\ud1b6\\ud1b7\\ud1b8\\ud1b9\\ud1ba\\ud1bb\\ud1bc\\ud1bd\\ud1be\\ud1bf\\ud1c0\\ud1c1\\ud1c2\\ud1c3\\ud1c4\\ud1c5\\ud1c6\\ud1c7\\ud1c8\\ud1c9\\ud1ca\\ud1cb\\ud1cc\\ud1cd\\ud1ce\\ud1cf\\ud1d0\\ud1d1\\ud1d2\\ud1d3\\ud1d4\\ud1d5\\ud1d6\\ud1d7\\ud1d8\\ud1d9\\ud1da\\ud1db\\ud1dc\\ud1dd\\ud1de\\ud1df\\ud1e0\\ud1e1\\ud1e2\\ud1e3\\ud1e4\\ud1e5\\ud1e6\\ud1e7\\ud1e8\\ud1e9\\ud1ea\\ud1eb\\ud1ec\\ud1ed\\ud1ee\\ud1ef\\ud1f0\\ud1f1\\ud1f2\\ud1f3\\ud1f4\\ud1f5\\ud1f6\\ud1f7\\ud1f8\\ud1f9\\ud1fa\\ud1fb\\ud1fc\\ud1fd\\ud1fe\\ud1ff\\ud200\\ud201\\ud202\\ud203\\ud204\\ud205\\ud206\\ud207\\ud208\\ud209\\ud20a\\ud20b\\ud20c\\ud20d\\ud20e\\ud20f\\ud210\\ud211\\ud212\\ud213\\ud214\\ud215\\ud216\\ud217\\ud218\\ud219\\ud21a\\ud21b\\ud21c\\ud21d\\ud21e\\ud21f\\ud220\\ud221\\ud222\\ud223\\ud224\\ud225\\ud226\\ud227\\ud228\\ud229\\ud22a\\ud22b\\ud22c\\ud22d\\ud22e\\ud22f\\ud230\\ud231\\ud232\\ud233\\ud234\\ud235\\ud236\\ud237\\ud238\\ud239\\ud23a\\ud23b\\ud23c\\ud23d\\ud23e\\ud23f\\ud240\\ud241\\ud242\\ud243\\ud244\\ud245\\ud246\\ud247\\ud248\\ud249\\ud24a\\ud24b\\ud24c\\ud24d\\ud24e\\ud24f\\ud250\\ud251\\ud252\\ud253\\ud254\\ud255\\ud256\\ud257\\ud258\\ud259\\ud25a\\ud25b\\ud25c\\ud25d\\ud25e\\ud25f\\ud260\\ud261\\ud262\\ud263\\ud264\\ud265\\ud266\\ud267\\ud268\\ud269\\ud26a\\ud26b\\ud26c\\ud26d\\ud26e\\ud26f\\ud270\\ud271\\ud272\\ud273\\ud274\\ud275\\ud276\\ud277\\ud278\\ud279\\ud27a\\ud27b\\ud27c\\ud27d\\ud27e\\ud27f\\ud280\\ud281\\ud282\\ud283\\ud284\\ud285\\ud286\\ud287\\ud288\\ud289\\ud28a\\ud28b\\ud28c\\ud28d\\ud28e\\ud28f\\ud290\\ud291\\ud292\\ud293\\ud294\\ud295\\ud296\\ud297\\ud298\\ud299\\ud29a\\ud29b\\ud29c\\ud29d\\ud29e\\ud29f\\ud2a0\\ud2a1\\ud2a2\\ud2a3\\ud2a4\\ud2a5\\ud2a6\\ud2a7\\ud2a8\\ud2a9\\ud2aa\\ud2ab\\ud2ac\\ud2ad\\ud2ae\\ud2af\\ud2b0\\ud2b1\\ud2b2\\ud2b3\\ud2b4\\ud2b5\\ud2b6\\ud2b7\\ud2b8\\ud2b9\\ud2ba\\ud2bb\\ud2bc\\ud2bd\\ud2be\\ud2bf\\ud2c0\\ud2c1\\ud2c2\\ud2c3\\ud2c4\\ud2c5\\ud2c6\\ud2c7\\ud2c8\\ud2c9\\ud2ca\\ud2cb\\ud2cc\\ud2cd\\ud2ce\\ud2cf\\ud2d0\\ud2d1\\ud2d2\\ud2d3\\ud2d4\\ud2d5\\ud2d6\\ud2d7\\ud2d8\\ud2d9\\ud2da\\ud2db\\ud2dc\\ud2dd\\ud2de\\ud2df\\ud2e0\\ud2e1\\ud2e2\\ud2e3\\ud2e4\\ud2e5\\ud2e6\\ud2e7\\ud2e8\\ud2e9\\ud2ea\\ud2eb\\ud2ec\\ud2ed\\ud2ee\\ud2ef\\ud2f0\\ud2f1\\ud2f2\\ud2f3\\ud2f4\\ud2f5\\ud2f6\\ud2f7\\ud2f8\\ud2f9\\ud2fa\\ud2fb\\ud2fc\\ud2fd\\ud2fe\\ud2ff\\ud300\\ud301\\ud302\\ud303\\ud304\\ud305\\ud306\\ud307\\ud308\\ud309\\ud30a\\ud30b\\ud30c\\ud30d\\ud30e\\ud30f\\ud310\\ud311\\ud312\\ud313\\ud314\\ud315\\ud316\\ud317\\ud318\\ud319\\ud31a\\ud31b\\ud31c\\ud31d\\ud31e\\ud31f\\ud320\\ud321\\ud322\\ud323\\ud324\\ud325\\ud326\\ud327\\ud328\\ud329\\ud32a\\ud32b\\ud32c\\ud32d\\ud32e\\ud32f\\ud330\\ud331\\ud332\\ud333\\ud334\\ud335\\ud336\\ud337\\ud338\\ud339\\ud33a\\ud33b\\ud33c\\ud33d\\ud33e\\ud33f\\ud340\\ud341\\ud342\\ud343\\ud344\\ud345\\ud346\\ud347\\ud348\\ud349\\ud34a\\ud34b\\ud34c\\ud34d\\ud34e\\ud34f\\ud350\\ud351\\ud352\\ud353\\ud354\\ud355\\ud356\\ud357\\ud358\\ud359\\ud35a\\ud35b\\ud35c\\ud35d\\ud35e\\ud35f\\ud360\\ud361\\ud362\\ud363\\ud364\\ud365\\ud366\\ud367\\ud368\\ud369\\ud36a\\ud36b\\ud36c\\ud36d\\ud36e\\ud36f\\ud370\\ud371\\ud372\\ud373\\ud374\\ud375\\ud376\\ud377\\ud378\\ud379\\ud37a\\ud37b\\ud37c\\ud37d\\ud37e\\ud37f\\ud380\\ud381\\ud382\\ud383\\ud384\\ud385\\ud386\\ud387\\ud388\\ud389\\ud38a\\ud38b\\ud38c\\ud38d\\ud38e\\ud38f\\ud390\\ud391\\ud392\\ud393\\ud394\\ud395\\ud396\\ud397\\ud398\\ud399\\ud39a\\ud39b\\ud39c\\ud39d\\ud39e\\ud39f\\ud3a0\\ud3a1\\ud3a2\\ud3a3\\ud3a4\\ud3a5\\ud3a6\\ud3a7\\ud3a8\\ud3a9\\ud3aa\\ud3ab\\ud3ac\\ud3ad\\ud3ae\\ud3af\\ud3b0\\ud3b1\\ud3b2\\ud3b3\\ud3b4\\ud3b5\\ud3b6\\ud3b7\\ud3b8\\ud3b9\\ud3ba\\ud3bb\\ud3bc\\ud3bd\\ud3be\\ud3bf\\ud3c0\\ud3c1\\ud3c2\\ud3c3\\ud3c4\\ud3c5\\ud3c6\\ud3c7\\ud3c8\\ud3c9\\ud3ca\\ud3cb\\ud3cc\\ud3cd\\ud3ce\\ud3cf\\ud3d0\\ud3d1\\ud3d2\\ud3d3\\ud3d4\\ud3d5\\ud3d6\\ud3d7\\ud3d8\\ud3d9\\ud3da\\ud3db\\ud3dc\\ud3dd\\ud3de\\ud3df\\ud3e0\\ud3e1\\ud3e2\\ud3e3\\ud3e4\\ud3e5\\ud3e6\\ud3e7\\ud3e8\\ud3e9\\ud3ea\\ud3eb\\ud3ec\\ud3ed\\ud3ee\\ud3ef\\ud3f0\\ud3f1\\ud3f2\\ud3f3\\ud3f4\\ud3f5\\ud3f6\\ud3f7\\ud3f8\\ud3f9\\ud3fa\\ud3fb\\ud3fc\\ud3fd\\ud3fe\\ud3ff\\ud400\\ud401\\ud402\\ud403\\ud404\\ud405\\ud406\\ud407\\ud408\\ud409\\ud40a\\ud40b\\ud40c\\ud40d\\ud40e\\ud40f\\ud410\\ud411\\ud412\\ud413\\ud414\\ud415\\ud416\\ud417\\ud418\\ud419\\ud41a\\ud41b\\ud41c\\ud41d\\ud41e\\ud41f\\ud420\\ud421\\ud422\\ud423\\ud424\\ud425\\ud426\\ud427\\ud428\\ud429\\ud42a\\ud42b\\ud42c\\ud42d\\ud42e\\ud42f\\ud430\\ud431\\ud432\\ud433\\ud434\\ud435\\ud436\\ud437\\ud438\\ud439\\ud43a\\ud43b\\ud43c\\ud43d\\ud43e\\ud43f\\ud440\\ud441\\ud442\\ud443\\ud444\\ud445\\ud446\\ud447\\ud448\\ud449\\ud44a\\ud44b\\ud44c\\ud44d\\ud44e\\ud44f\\ud450\\ud451\\ud452\\ud453\\ud454\\ud455\\ud456\\ud457\\ud458\\ud459\\ud45a\\ud45b\\ud45c\\ud45d\\ud45e\\ud45f\\ud460\\ud461\\ud462\\ud463\\ud464\\ud465\\ud466\\ud467\\ud468\\ud469\\ud46a\\ud46b\\ud46c\\ud46d\\ud46e\\ud46f\\ud470\\ud471\\ud472\\ud473\\ud474\\ud475\\ud476\\ud477\\ud478\\ud479\\ud47a\\ud47b\\ud47c\\ud47d\\ud47e\\ud47f\\ud480\\ud481\\ud482\\ud483\\ud484\\ud485\\ud486\\ud487\\ud488\\ud489\\ud48a\\ud48b\\ud48c\\ud48d\\ud48e\\ud48f\\ud490\\ud491\\ud492\\ud493\\ud494\\ud495\\ud496\\ud497\\ud498\\ud499\\ud49a\\ud49b\\ud49c\\ud49d\\ud49e\\ud49f\\ud4a0\\ud4a1\\ud4a2\\ud4a3\\ud4a4\\ud4a5\\ud4a6\\ud4a7\\ud4a8\\ud4a9\\ud4aa\\ud4ab\\ud4ac\\ud4ad\\ud4ae\\ud4af\\ud4b0\\ud4b1\\ud4b2\\ud4b3\\ud4b4\\ud4b5\\ud4b6\\ud4b7\\ud4b8\\ud4b9\\ud4ba\\ud4bb\\ud4bc\\ud4bd\\ud4be\\ud4bf\\ud4c0\\ud4c1\\ud4c2\\ud4c3\\ud4c4\\ud4c5\\ud4c6\\ud4c7\\ud4c8\\ud4c9\\ud4ca\\ud4cb\\ud4cc\\ud4cd\\ud4ce\\ud4cf\\ud4d0\\ud4d1\\ud4d2\\ud4d3\\ud4d4\\ud4d5\\ud4d6\\ud4d7\\ud4d8\\ud4d9\\ud4da\\ud4db\\ud4dc\\ud4dd\\ud4de\\ud4df\\ud4e0\\ud4e1\\ud4e2\\ud4e3\\ud4e4\\ud4e5\\ud4e6\\ud4e7\\ud4e8\\ud4e9\\ud4ea\\ud4eb\\ud4ec\\ud4ed\\ud4ee\\ud4ef\\ud4f0\\ud4f1\\ud4f2\\ud4f3\\ud4f4\\ud4f5\\ud4f6\\ud4f7\\ud4f8\\ud4f9\\ud4fa\\ud4fb\\ud4fc\\ud4fd\\ud4fe\\ud4ff\\ud500\\ud501\\ud502\\ud503\\ud504\\ud505\\ud506\\ud507\\ud508\\ud509\\ud50a\\ud50b\\ud50c\\ud50d\\ud50e\\ud50f\\ud510\\ud511\\ud512\\ud513\\ud514\\ud515\\ud516\\ud517\\ud518\\ud519\\ud51a\\ud51b\\ud51c\\ud51d\\ud51e\\ud51f\\ud520\\ud521\\ud522\\ud523\\ud524\\ud525\\ud526\\ud527\\ud528\\ud529\\ud52a\\ud52b\\ud52c\\ud52d\\ud52e\\ud52f\\ud530\\ud531\\ud532\\ud533\\ud534\\ud535\\ud536\\ud537\\ud538\\ud539\\ud53a\\ud53b\\ud53c\\ud53d\\ud53e\\ud53f\\ud540\\ud541\\ud542\\ud543\\ud544\\ud545\\ud546\\ud547\\ud548\\ud549\\ud54a\\ud54b\\ud54c\\ud54d\\ud54e\\ud54f\\ud550\\ud551\\ud552\\ud553\\ud554\\ud555\\ud556\\ud557\\ud558\\ud559\\ud55a\\ud55b\\ud55c\\ud55d\\ud55e\\ud55f\\ud560\\ud561\\ud562\\ud563\\ud564\\ud565\\ud566\\ud567\\ud568\\ud569\\ud56a\\ud56b\\ud56c\\ud56d\\ud56e\\ud56f\\ud570\\ud571\\ud572\\ud573\\ud574\\ud575\\ud576\\ud577\\ud578\\ud579\\ud57a\\ud57b\\ud57c\\ud57d\\ud57e\\ud57f\\ud580\\ud581\\ud582\\ud583\\ud584\\ud585\\ud586\\ud587\\ud588\\ud589\\ud58a\\ud58b\\ud58c\\ud58d\\ud58e\\ud58f\\ud590\\ud591\\ud592\\ud593\\ud594\\ud595\\ud596\\ud597\\ud598\\ud599\\ud59a\\ud59b\\ud59c\\ud59d\\ud59e\\ud59f\\ud5a0\\ud5a1\\ud5a2\\ud5a3\\ud5a4\\ud5a5\\ud5a6\\ud5a7\\ud5a8\\ud5a9\\ud5aa\\ud5ab\\ud5ac\\ud5ad\\ud5ae\\ud5af\\ud5b0\\ud5b1\\ud5b2\\ud5b3\\ud5b4\\ud5b5\\ud5b6\\ud5b7\\ud5b8\\ud5b9\\ud5ba\\ud5bb\\ud5bc\\ud5bd\\ud5be\\ud5bf\\ud5c0\\ud5c1\\ud5c2\\ud5c3\\ud5c4\\ud5c5\\ud5c6\\ud5c7\\ud5c8\\ud5c9\\ud5ca\\ud5cb\\ud5cc\\ud5cd\\ud5ce\\ud5cf\\ud5d0\\ud5d1\\ud5d2\\ud5d3\\ud5d4\\ud5d5\\ud5d6\\ud5d7\\ud5d8\\ud5d9\\ud5da\\ud5db\\ud5dc\\ud5dd\\ud5de\\ud5df\\ud5e0\\ud5e1\\ud5e2\\ud5e3\\ud5e4\\ud5e5\\ud5e6\\ud5e7\\ud5e8\\ud5e9\\ud5ea\\ud5eb\\ud5ec\\ud5ed\\ud5ee\\ud5ef\\ud5f0\\ud5f1\\ud5f2\\ud5f3\\ud5f4\\ud5f5\\ud5f6\\ud5f7\\ud5f8\\ud5f9\\ud5fa\\ud5fb\\ud5fc\\ud5fd\\ud5fe\\ud5ff\\ud600\\ud601\\ud602\\ud603\\ud604\\ud605\\ud606\\ud607\\ud608\\ud609\\ud60a\\ud60b\\ud60c\\ud60d\\ud60e\\ud60f\\ud610\\ud611\\ud612\\ud613\\ud614\\ud615\\ud616\\ud617\\ud618\\ud619\\ud61a\\ud61b\\ud61c\\ud61d\\ud61e\\ud61f\\ud620\\ud621\\ud622\\ud623\\ud624\\ud625\\ud626\\ud627\\ud628\\ud629\\ud62a\\ud62b\\ud62c\\ud62d\\ud62e\\ud62f\\ud630\\ud631\\ud632\\ud633\\ud634\\ud635\\ud636\\ud637\\ud638\\ud639\\ud63a\\ud63b\\ud63c\\ud63d\\ud63e\\ud63f\\ud640\\ud641\\ud642\\ud643\\ud644\\ud645\\ud646\\ud647\\ud648\\ud649\\ud64a\\ud64b\\ud64c\\ud64d\\ud64e\\ud64f\\ud650\\ud651\\ud652\\ud653\\ud654\\ud655\\ud656\\ud657\\ud658\\ud659\\ud65a\\ud65b\\ud65c\\ud65d\\ud65e\\ud65f\\ud660\\ud661\\ud662\\ud663\\ud664\\ud665\\ud666\\ud667\\ud668\\ud669\\ud66a\\ud66b\\ud66c\\ud66d\\ud66e\\ud66f\\ud670\\ud671\\ud672\\ud673\\ud674\\ud675\\ud676\\ud677\\ud678\\ud679\\ud67a\\ud67b\\ud67c\\ud67d\\ud67e\\ud67f\\ud680\\ud681\\ud682\\ud683\\ud684\\ud685\\ud686\\ud687\\ud688\\ud689\\ud68a\\ud68b\\ud68c\\ud68d\\ud68e\\ud68f\\ud690\\ud691\\ud692\\ud693\\ud694\\ud695\\ud696\\ud697\\ud698\\ud699\\ud69a\\ud69b\\ud69c\\ud69d\\ud69e\\ud69f\\ud6a0\\ud6a1\\ud6a2\\ud6a3\\ud6a4\\ud6a5\\ud6a6\\ud6a7\\ud6a8\\ud6a9\\ud6aa\\ud6ab\\ud6ac\\ud6ad\\ud6ae\\ud6af\\ud6b0\\ud6b1\\ud6b2\\ud6b3\\ud6b4\\ud6b5\\ud6b6\\ud6b7\\ud6b8\\ud6b9\\ud6ba\\ud6bb\\ud6bc\\ud6bd\\ud6be\\ud6bf\\ud6c0\\ud6c1\\ud6c2\\ud6c3\\ud6c4\\ud6c5\\ud6c6\\ud6c7\\ud6c8\\ud6c9\\ud6ca\\ud6cb\\ud6cc\\ud6cd\\ud6ce\\ud6cf\\ud6d0\\ud6d1\\ud6d2\\ud6d3\\ud6d4\\ud6d5\\ud6d6\\ud6d7\\ud6d8\\ud6d9\\ud6da\\ud6db\\ud6dc\\ud6dd\\ud6de\\ud6df\\ud6e0\\ud6e1\\ud6e2\\ud6e3\\ud6e4\\ud6e5\\ud6e6\\ud6e7\\ud6e8\\ud6e9\\ud6ea\\ud6eb\\ud6ec\\ud6ed\\ud6ee\\ud6ef\\ud6f0\\ud6f1\\ud6f2\\ud6f3\\ud6f4\\ud6f5\\ud6f6\\ud6f7\\ud6f8\\ud6f9\\ud6fa\\ud6fb\\ud6fc\\ud6fd\\ud6fe\\ud6ff\\ud700\\ud701\\ud702\\ud703\\ud704\\ud705\\ud706\\ud707\\ud708\\ud709\\ud70a\\ud70b\\ud70c\\ud70d\\ud70e\\ud70f\\ud710\\ud711\\ud712\\ud713\\ud714\\ud715\\ud716\\ud717\\ud718\\ud719\\ud71a\\ud71b\\ud71c\\ud71d\\ud71e\\ud71f\\ud720\\ud721\\ud722\\ud723\\ud724\\ud725\\ud726\\ud727\\ud728\\ud729\\ud72a\\ud72b\\ud72c\\ud72d\\ud72e\\ud72f\\ud730\\ud731\\ud732\\ud733\\ud734\\ud735\\ud736\\ud737\\ud738\\ud739\\ud73a\\ud73b\\ud73c\\ud73d\\ud73e\\ud73f\\ud740\\ud741\\ud742\\ud743\\ud744\\ud745\\ud746\\ud747\\ud748\\ud749\\ud74a\\ud74b\\ud74c\\ud74d\\ud74e\\ud74f\\ud750\\ud751\\ud752\\ud753\\ud754\\ud755\\ud756\\ud757\\ud758\\ud759\\ud75a\\ud75b\\ud75c\\ud75d\\ud75e\\ud75f\\ud760\\ud761\\ud762\\ud763\\ud764\\ud765\\ud766\\ud767\\ud768\\ud769\\ud76a\\ud76b\\ud76c\\ud76d\\ud76e\\ud76f\\ud770\\ud771\\ud772\\ud773\\ud774\\ud775\\ud776\\ud777\\ud778\\ud779\\ud77a\\ud77b\\ud77c\\ud77d\\ud77e\\ud77f\\ud780\\ud781\\ud782\\ud783\\ud784\\ud785\\ud786\\ud787\\ud788\\ud789\\ud78a\\ud78b\\ud78c\\ud78d\\ud78e\\ud78f\\ud790\\ud791\\ud792\\ud793\\ud794\\ud795\\ud796\\ud797\\ud798\\ud799\\ud79a\\ud79b\\ud79c\\ud79d\\ud79e\\ud79f\\ud7a0\\ud7a1\\ud7a2\\ud7a3\\uf900\\uf901\\uf902\\uf903\\uf904\\uf905\\uf906\\uf907\\uf908\\uf909\\uf90a\\uf90b\\uf90c\\uf90d\\uf90e\\uf90f\\uf910\\uf911\\uf912\\uf913\\uf914\\uf915\\uf916\\uf917\\uf918\\uf919\\uf91a\\uf91b\\uf91c\\uf91d\\uf91e\\uf91f\\uf920\\uf921\\uf922\\uf923\\uf924\\uf925\\uf926\\uf927\\uf928\\uf929\\uf92a\\uf92b\\uf92c\\uf92d\\uf92e\\uf92f\\uf930\\uf931\\uf932\\uf933\\uf934\\uf935\\uf936\\uf937\\uf938\\uf939\\uf93a\\uf93b\\uf93c\\uf93d\\uf93e\\uf93f\\uf940\\uf941\\uf942\\uf943\\uf944\\uf945\\uf946\\uf947\\uf948\\uf949\\uf94a\\uf94b\\uf94c\\uf94d\\uf94e\\uf94f\\uf950\\uf951\\uf952\\uf953\\uf954\\uf955\\uf956\\uf957\\uf958\\uf959\\uf95a\\uf95b\\uf95c\\uf95d\\uf95e\\uf95f\\uf960\\uf961\\uf962\\uf963\\uf964\\uf965\\uf966\\uf967\\uf968\\uf969\\uf96a\\uf96b\\uf96c\\uf96d\\uf96e\\uf96f\\uf970\\uf971\\uf972\\uf973\\uf974\\uf975\\uf976\\uf977\\uf978\\uf979\\uf97a\\uf97b\\uf97c\\uf97d\\uf97e\\uf97f\\uf980\\uf981\\uf982\\uf983\\uf984\\uf985\\uf986\\uf987\\uf988\\uf989\\uf98a\\uf98b\\uf98c\\uf98d\\uf98e\\uf98f\\uf990\\uf991\\uf992\\uf993\\uf994\\uf995\\uf996\\uf997\\uf998\\uf999\\uf99a\\uf99b\\uf99c\\uf99d\\uf99e\\uf99f\\uf9a0\\uf9a1\\uf9a2\\uf9a3\\uf9a4\\uf9a5\\uf9a6\\uf9a7\\uf9a8\\uf9a9\\uf9aa\\uf9ab\\uf9ac\\uf9ad\\uf9ae\\uf9af\\uf9b0\\uf9b1\\uf9b2\\uf9b3\\uf9b4\\uf9b5\\uf9b6\\uf9b7\\uf9b8\\uf9b9\\uf9ba\\uf9bb\\uf9bc\\uf9bd\\uf9be\\uf9bf\\uf9c0\\uf9c1\\uf9c2\\uf9c3\\uf9c4\\uf9c5\\uf9c6\\uf9c7\\uf9c8\\uf9c9\\uf9ca\\uf9cb\\uf9cc\\uf9cd\\uf9ce\\uf9cf\\uf9d0\\uf9d1\\uf9d2\\uf9d3\\uf9d4\\uf9d5\\uf9d6\\uf9d7\\uf9d8\\uf9d9\\uf9da\\uf9db\\uf9dc\\uf9dd\\uf9de\\uf9df\\uf9e0\\uf9e1\\uf9e2\\uf9e3\\uf9e4\\uf9e5\\uf9e6\\uf9e7\\uf9e8\\uf9e9\\uf9ea\\uf9eb\\uf9ec\\uf9ed\\uf9ee\\uf9ef\\uf9f0\\uf9f1\\uf9f2\\uf9f3\\uf9f4\\uf9f5\\uf9f6\\uf9f7\\uf9f8\\uf9f9\\uf9fa\\uf9fb\\uf9fc\\uf9fd\\uf9fe\\uf9ff\\ufa00\\ufa01\\ufa02\\ufa03\\ufa04\\ufa05\\ufa06\\ufa07\\ufa08\\ufa09\\ufa0a\\ufa0b\\ufa0c\\ufa0d\\ufa0e\\ufa0f\\ufa10\\ufa11\\ufa12\\ufa13\\ufa14\\ufa15\\ufa16\\ufa17\\ufa18\\ufa19\\ufa1a\\ufa1b\\ufa1c\\ufa1d\\ufa1e\\ufa1f\\ufa20\\ufa21\\ufa22\\ufa23\\ufa24\\ufa25\\ufa26\\ufa27\\ufa28\\ufa29\\ufa2a\\ufa2b\\ufa2c\\ufa2d\\ufa30\\ufa31\\ufa32\\ufa33\\ufa34\\ufa35\\ufa36\\ufa37\\ufa38\\ufa39\\ufa3a\\ufa3b\\ufa3c\\ufa3d\\ufa3e\\ufa3f\\ufa40\\ufa41\\ufa42\\ufa43\\ufa44\\ufa45\\ufa46\\ufa47\\ufa48\\ufa49\\ufa4a\\ufa4b\\ufa4c\\ufa4d\\ufa4e\\ufa4f\\ufa50\\ufa51\\ufa52\\ufa53\\ufa54\\ufa55\\ufa56\\ufa57\\ufa58\\ufa59\\ufa5a\\ufa5b\\ufa5c\\ufa5d\\ufa5e\\ufa5f\\ufa60\\ufa61\\ufa62\\ufa63\\ufa64\\ufa65\\ufa66\\ufa67\\ufa68\\ufa69\\ufa6a\\ufa70\\ufa71\\ufa72\\ufa73\\ufa74\\ufa75\\ufa76\\ufa77\\ufa78\\ufa79\\ufa7a\\ufa7b\\ufa7c\\ufa7d\\ufa7e\\ufa7f\\ufa80\\ufa81\\ufa82\\ufa83\\ufa84\\ufa85\\ufa86\\ufa87\\ufa88\\ufa89\\ufa8a\\ufa8b\\ufa8c\\ufa8d\\ufa8e\\ufa8f\\ufa90\\ufa91\\ufa92\\ufa93\\ufa94\\ufa95\\ufa96\\ufa97\\ufa98\\ufa99\\ufa9a\\ufa9b\\ufa9c\\ufa9d\\ufa9e\\ufa9f\\ufaa0\\ufaa1\\ufaa2\\ufaa3\\ufaa4\\ufaa5\\ufaa6\\ufaa7\\ufaa8\\ufaa9\\ufaaa\\ufaab\\ufaac\\ufaad\\ufaae\\ufaaf\\ufab0\\ufab1\\ufab2\\ufab3\\ufab4\\ufab5\\ufab6\\ufab7\\ufab8\\ufab9\\ufaba\\ufabb\\ufabc\\ufabd\\ufabe\\ufabf\\ufac0\\ufac1\\ufac2\\ufac3\\ufac4\\ufac5\\ufac6\\ufac7\\ufac8\\ufac9\\ufaca\\ufacb\\ufacc\\ufacd\\uface\\ufacf\\ufad0\\ufad1\\ufad2\\ufad3\\ufad4\\ufad5\\ufad6\\ufad7\\ufad8\\ufad9\\ufb1d\\ufb1f\\ufb20\\ufb21\\ufb22\\ufb23\\ufb24\\ufb25\\ufb26\\ufb27\\ufb28\\ufb2a\\ufb2b\\ufb2c\\ufb2d\\ufb2e\\ufb2f\\ufb30\\ufb31\\ufb32\\ufb33\\ufb34\\ufb35\\ufb36\\ufb38\\ufb39\\ufb3a\\ufb3b\\ufb3c\\ufb3e\\ufb40\\ufb41\\ufb43\\ufb44\\ufb46\\ufb47\\ufb48\\ufb49\\ufb4a\\ufb4b\\ufb4c\\ufb4d\\ufb4e\\ufb4f\\ufb50\\ufb51\\ufb52\\ufb53\\ufb54\\ufb55\\ufb56\\ufb57\\ufb58\\ufb59\\ufb5a\\ufb5b\\ufb5c\\ufb5d\\ufb5e\\ufb5f\\ufb60\\ufb61\\ufb62\\ufb63\\ufb64\\ufb65\\ufb66\\ufb67\\ufb68\\ufb69\\ufb6a\\ufb6b\\ufb6c\\ufb6d\\ufb6e\\ufb6f\\ufb70\\ufb71\\ufb72\\ufb73\\ufb74\\ufb75\\ufb76\\ufb77\\ufb78\\ufb79\\ufb7a\\ufb7b\\ufb7c\\ufb7d\\ufb7e\\ufb7f\\ufb80\\ufb81\\ufb82\\ufb83\\ufb84\\ufb85\\ufb86\\ufb87\\ufb88\\ufb89\\ufb8a\\ufb8b\\ufb8c\\ufb8d\\ufb8e\\ufb8f\\ufb90\\ufb91\\ufb92\\ufb93\\ufb94\\ufb95\\ufb96\\ufb97\\ufb98\\ufb99\\ufb9a\\ufb9b\\ufb9c\\ufb9d\\ufb9e\\ufb9f\\ufba0\\ufba1\\ufba2\\ufba3\\ufba4\\ufba5\\ufba6\\ufba7\\ufba8\\ufba9\\ufbaa\\ufbab\\ufbac\\ufbad\\ufbae\\ufbaf\\ufbb0\\ufbb1\\ufbd3\\ufbd4\\ufbd5\\ufbd6\\ufbd7\\ufbd8\\ufbd9\\ufbda\\ufbdb\\ufbdc\\ufbdd\\ufbde\\ufbdf\\ufbe0\\ufbe1\\ufbe2\\ufbe3\\ufbe4\\ufbe5\\ufbe6\\ufbe7\\ufbe8\\ufbe9\\ufbea\\ufbeb\\ufbec\\ufbed\\ufbee\\ufbef\\ufbf0\\ufbf1\\ufbf2\\ufbf3\\ufbf4\\ufbf5\\ufbf6\\ufbf7\\ufbf8\\ufbf9\\ufbfa\\ufbfb\\ufbfc\\ufbfd\\ufbfe\\ufbff\\ufc00\\ufc01\\ufc02\\ufc03\\ufc04\\ufc05\\ufc06\\ufc07\\ufc08\\ufc09\\ufc0a\\ufc0b\\ufc0c\\ufc0d\\ufc0e\\ufc0f\\ufc10\\ufc11\\ufc12\\ufc13\\ufc14\\ufc15\\ufc16\\ufc17\\ufc18\\ufc19\\ufc1a\\ufc1b\\ufc1c\\ufc1d\\ufc1e\\ufc1f\\ufc20\\ufc21\\ufc22\\ufc23\\ufc24\\ufc25\\ufc26\\ufc27\\ufc28\\ufc29\\ufc2a\\ufc2b\\ufc2c\\ufc2d\\ufc2e\\ufc2f\\ufc30\\ufc31\\ufc32\\ufc33\\ufc34\\ufc35\\ufc36\\ufc37\\ufc38\\ufc39\\ufc3a\\ufc3b\\ufc3c\\ufc3d\\ufc3e\\ufc3f\\ufc40\\ufc41\\ufc42\\ufc43\\ufc44\\ufc45\\ufc46\\ufc47\\ufc48\\ufc49\\ufc4a\\ufc4b\\ufc4c\\ufc4d\\ufc4e\\ufc4f\\ufc50\\ufc51\\ufc52\\ufc53\\ufc54\\ufc55\\ufc56\\ufc57\\ufc58\\ufc59\\ufc5a\\ufc5b\\ufc5c\\ufc5d\\ufc5e\\ufc5f\\ufc60\\ufc61\\ufc62\\ufc63\\ufc64\\ufc65\\ufc66\\ufc67\\ufc68\\ufc69\\ufc6a\\ufc6b\\ufc6c\\ufc6d\\ufc6e\\ufc6f\\ufc70\\ufc71\\ufc72\\ufc73\\ufc74\\ufc75\\ufc76\\ufc77\\ufc78\\ufc79\\ufc7a\\ufc7b\\ufc7c\\ufc7d\\ufc7e\\ufc7f\\ufc80\\ufc81\\ufc82\\ufc83\\ufc84\\ufc85\\ufc86\\ufc87\\ufc88\\ufc89\\ufc8a\\ufc8b\\ufc8c\\ufc8d\\ufc8e\\ufc8f\\ufc90\\ufc91\\ufc92\\ufc93\\ufc94\\ufc95\\ufc96\\ufc97\\ufc98\\ufc99\\ufc9a\\ufc9b\\ufc9c\\ufc9d\\ufc9e\\ufc9f\\ufca0\\ufca1\\ufca2\\ufca3\\ufca4\\ufca5\\ufca6\\ufca7\\ufca8\\ufca9\\ufcaa\\ufcab\\ufcac\\ufcad\\ufcae\\ufcaf\\ufcb0\\ufcb1\\ufcb2\\ufcb3\\ufcb4\\ufcb5\\ufcb6\\ufcb7\\ufcb8\\ufcb9\\ufcba\\ufcbb\\ufcbc\\ufcbd\\ufcbe\\ufcbf\\ufcc0\\ufcc1\\ufcc2\\ufcc3\\ufcc4\\ufcc5\\ufcc6\\ufcc7\\ufcc8\\ufcc9\\ufcca\\ufccb\\ufccc\\ufccd\\ufcce\\ufccf\\ufcd0\\ufcd1\\ufcd2\\ufcd3\\ufcd4\\ufcd5\\ufcd6\\ufcd7\\ufcd8\\ufcd9\\ufcda\\ufcdb\\ufcdc\\ufcdd\\ufcde\\ufcdf\\ufce0\\ufce1\\ufce2\\ufce3\\ufce4\\ufce5\\ufce6\\ufce7\\ufce8\\ufce9\\ufcea\\ufceb\\ufcec\\ufced\\ufcee\\ufcef\\ufcf0\\ufcf1\\ufcf2\\ufcf3\\ufcf4\\ufcf5\\ufcf6\\ufcf7\\ufcf8\\ufcf9\\ufcfa\\ufcfb\\ufcfc\\ufcfd\\ufcfe\\ufcff\\ufd00\\ufd01\\ufd02\\ufd03\\ufd04\\ufd05\\ufd06\\ufd07\\ufd08\\ufd09\\ufd0a\\ufd0b\\ufd0c\\ufd0d\\ufd0e\\ufd0f\\ufd10\\ufd11\\ufd12\\ufd13\\ufd14\\ufd15\\ufd16\\ufd17\\ufd18\\ufd19\\ufd1a\\ufd1b\\ufd1c\\ufd1d\\ufd1e\\ufd1f\\ufd20\\ufd21\\ufd22\\ufd23\\ufd24\\ufd25\\ufd26\\ufd27\\ufd28\\ufd29\\ufd2a\\ufd2b\\ufd2c\\ufd2d\\ufd2e\\ufd2f\\ufd30\\ufd31\\ufd32\\ufd33\\ufd34\\ufd35\\ufd36\\ufd37\\ufd38\\ufd39\\ufd3a\\ufd3b\\ufd3c\\ufd3d\\ufd50\\ufd51\\ufd52\\ufd53\\ufd54\\ufd55\\ufd56\\ufd57\\ufd58\\ufd59\\ufd5a\\ufd5b\\ufd5c\\ufd5d\\ufd5e\\ufd5f\\ufd60\\ufd61\\ufd62\\ufd63\\ufd64\\ufd65\\ufd66\\ufd67\\ufd68\\ufd69\\ufd6a\\ufd6b\\ufd6c\\ufd6d\\ufd6e\\ufd6f\\ufd70\\ufd71\\ufd72\\ufd73\\ufd74\\ufd75\\ufd76\\ufd77\\ufd78\\ufd79\\ufd7a\\ufd7b\\ufd7c\\ufd7d\\ufd7e\\ufd7f\\ufd80\\ufd81\\ufd82\\ufd83\\ufd84\\ufd85\\ufd86\\ufd87\\ufd88\\ufd89\\ufd8a\\ufd8b\\ufd8c\\ufd8d\\ufd8e\\ufd8f\\ufd92\\ufd93\\ufd94\\ufd95\\ufd96\\ufd97\\ufd98\\ufd99\\ufd9a\\ufd9b\\ufd9c\\ufd9d\\ufd9e\\ufd9f\\ufda0\\ufda1\\ufda2\\ufda3\\ufda4\\ufda5\\ufda6\\ufda7\\ufda8\\ufda9\\ufdaa\\ufdab\\ufdac\\ufdad\\ufdae\\ufdaf\\ufdb0\\ufdb1\\ufdb2\\ufdb3\\ufdb4\\ufdb5\\ufdb6\\ufdb7\\ufdb8\\ufdb9\\ufdba\\ufdbb\\ufdbc\\ufdbd\\ufdbe\\ufdbf\\ufdc0\\ufdc1\\ufdc2\\ufdc3\\ufdc4\\ufdc5\\ufdc6\\ufdc7\\ufdf0\\ufdf1\\ufdf2\\ufdf3\\ufdf4\\ufdf5\\ufdf6\\ufdf7\\ufdf8\\ufdf9\\ufdfa\\ufdfb\\ufe70\\ufe71\\ufe72\\ufe73\\ufe74\\ufe76\\ufe77\\ufe78\\ufe79\\ufe7a\\ufe7b\\ufe7c\\ufe7d\\ufe7e\\ufe7f\\ufe80\\ufe81\\ufe82\\ufe83\\ufe84\\ufe85\\ufe86\\ufe87\\ufe88\\ufe89\\ufe8a\\ufe8b\\ufe8c\\ufe8d\\ufe8e\\ufe8f\\ufe90\\ufe91\\ufe92\\ufe93\\ufe94\\ufe95\\ufe96\\ufe97\\ufe98\\ufe99\\ufe9a\\ufe9b\\ufe9c\\ufe9d\\ufe9e\\ufe9f\\ufea0\\ufea1\\ufea2\\ufea3\\ufea4\\ufea5\\ufea6\\ufea7\\ufea8\\ufea9\\ufeaa\\ufeab\\ufeac\\ufead\\ufeae\\ufeaf\\ufeb0\\ufeb1\\ufeb2\\ufeb3\\ufeb4\\ufeb5\\ufeb6\\ufeb7\\ufeb8\\ufeb9\\ufeba\\ufebb\\ufebc\\ufebd\\ufebe\\ufebf\\ufec0\\ufec1\\ufec2\\ufec3\\ufec4\\ufec5\\ufec6\\ufec7\\ufec8\\ufec9\\ufeca\\ufecb\\ufecc\\ufecd\\ufece\\ufecf\\ufed0\\ufed1\\ufed2\\ufed3\\ufed4\\ufed5\\ufed6\\ufed7\\ufed8\\ufed9\\ufeda\\ufedb\\ufedc\\ufedd\\ufede\\ufedf\\ufee0\\ufee1\\ufee2\\ufee3\\ufee4\\ufee5\\ufee6\\ufee7\\ufee8\\ufee9\\ufeea\\ufeeb\\ufeec\\ufeed\\ufeee\\ufeef\\ufef0\\ufef1\\ufef2\\ufef3\\ufef4\\ufef5\\ufef6\\ufef7\\ufef8\\ufef9\\ufefa\\ufefb\\ufefc\\uff66\\uff67\\uff68\\uff69\\uff6a\\uff6b\\uff6c\\uff6d\\uff6e\\uff6f\\uff71\\uff72\\uff73\\uff74\\uff75\\uff76\\uff77\\uff78\\uff79\\uff7a\\uff7b\\uff7c\\uff7d\\uff7e\\uff7f\\uff80\\uff81\\uff82\\uff83\\uff84\\uff85\\uff86\\uff87\\uff88\\uff89\\uff8a\\uff8b\\uff8c\\uff8d\\uff8e\\uff8f\\uff90\\uff91\\uff92\\uff93\\uff94\\uff95\\uff96\\uff97\\uff98\\uff99\\uff9a\\uff9b\\uff9c\\uff9d\\uffa0\\uffa1\\uffa2\\uffa3\\uffa4\\uffa5\\uffa6\\uffa7\\uffa8\\uffa9\\uffaa\\uffab\\uffac\\uffad\\uffae\\uffaf\\uffb0\\uffb1\\uffb2\\uffb3\\uffb4\\uffb5\\uffb6\\uffb7\\uffb8\\uffb9\\uffba\\uffbb\\uffbc\\uffbd\\uffbe\\uffc2\\uffc3\\uffc4\\uffc5\\uffc6\\uffc7\\uffca\\uffcb\\uffcc\\uffcd\\uffce\\uffcf\\uffd2\\uffd3\\uffd4\\uffd5\\uffd6\\uffd7\\uffda\\uffdb\\uffdc'\n\nLt = u'\\u01c5\\u01c8\\u01cb\\u01f2\\u1f88\\u1f89\\u1f8a\\u1f8b\\u1f8c\\u1f8d\\u1f8e\\u1f8f\\u1f98\\u1f99\\u1f9a\\u1f9b\\u1f9c\\u1f9d\\u1f9e\\u1f9f\\u1fa8\\u1fa9\\u1faa\\u1fab\\u1fac\\u1fad\\u1fae\\u1faf\\u1fbc\\u1fcc\\u1ffc'\n\nLu = u'ABCDEFGHIJKLMNOPQRSTUVWXYZ\\xc0\\xc1\\xc2\\xc3\\xc4\\xc5\\xc6\\xc7\\xc8\\xc9\\xca\\xcb\\xcc\\xcd\\xce\\xcf\\xd0\\xd1\\xd2\\xd3\\xd4\\xd5\\xd6\\xd8\\xd9\\xda\\xdb\\xdc\\xdd\\xde\\u0100\\u0102\\u0104\\u0106\\u0108\\u010a\\u010c\\u010e\\u0110\\u0112\\u0114\\u0116\\u0118\\u011a\\u011c\\u011e\\u0120\\u0122\\u0124\\u0126\\u0128\\u012a\\u012c\\u012e\\u0130\\u0132\\u0134\\u0136\\u0139\\u013b\\u013d\\u013f\\u0141\\u0143\\u0145\\u0147\\u014a\\u014c\\u014e\\u0150\\u0152\\u0154\\u0156\\u0158\\u015a\\u015c\\u015e\\u0160\\u0162\\u0164\\u0166\\u0168\\u016a\\u016c\\u016e\\u0170\\u0172\\u0174\\u0176\\u0178\\u0179\\u017b\\u017d\\u0181\\u0182\\u0184\\u0186\\u0187\\u0189\\u018a\\u018b\\u018e\\u018f\\u0190\\u0191\\u0193\\u0194\\u0196\\u0197\\u0198\\u019c\\u019d\\u019f\\u01a0\\u01a2\\u01a4\\u01a6\\u01a7\\u01a9\\u01ac\\u01ae\\u01af\\u01b1\\u01b2\\u01b3\\u01b5\\u01b7\\u01b8\\u01bc\\u01c4\\u01c7\\u01ca\\u01cd\\u01cf\\u01d1\\u01d3\\u01d5\\u01d7\\u01d9\\u01db\\u01de\\u01e0\\u01e2\\u01e4\\u01e6\\u01e8\\u01ea\\u01ec\\u01ee\\u01f1\\u01f4\\u01f6\\u01f7\\u01f8\\u01fa\\u01fc\\u01fe\\u0200\\u0202\\u0204\\u0206\\u0208\\u020a\\u020c\\u020e\\u0210\\u0212\\u0214\\u0216\\u0218\\u021a\\u021c\\u021e\\u0220\\u0222\\u0224\\u0226\\u0228\\u022a\\u022c\\u022e\\u0230\\u0232\\u023a\\u023b\\u023d\\u023e\\u0241\\u0386\\u0388\\u0389\\u038a\\u038c\\u038e\\u038f\\u0391\\u0392\\u0393\\u0394\\u0395\\u0396\\u0397\\u0398\\u0399\\u039a\\u039b\\u039c\\u039d\\u039e\\u039f\\u03a0\\u03a1\\u03a3\\u03a4\\u03a5\\u03a6\\u03a7\\u03a8\\u03a9\\u03aa\\u03ab\\u03d2\\u03d3\\u03d4\\u03d8\\u03da\\u03dc\\u03de\\u03e0\\u03e2\\u03e4\\u03e6\\u03e8\\u03ea\\u03ec\\u03ee\\u03f4\\u03f7\\u03f9\\u03fa\\u03fd\\u03fe\\u03ff\\u0400\\u0401\\u0402\\u0403\\u0404\\u0405\\u0406\\u0407\\u0408\\u0409\\u040a\\u040b\\u040c\\u040d\\u040e\\u040f\\u0410\\u0411\\u0412\\u0413\\u0414\\u0415\\u0416\\u0417\\u0418\\u0419\\u041a\\u041b\\u041c\\u041d\\u041e\\u041f\\u0420\\u0421\\u0422\\u0423\\u0424\\u0425\\u0426\\u0427\\u0428\\u0429\\u042a\\u042b\\u042c\\u042d\\u042e\\u042f\\u0460\\u0462\\u0464\\u0466\\u0468\\u046a\\u046c\\u046e\\u0470\\u0472\\u0474\\u0476\\u0478\\u047a\\u047c\\u047e\\u0480\\u048a\\u048c\\u048e\\u0490\\u0492\\u0494\\u0496\\u0498\\u049a\\u049c\\u049e\\u04a0\\u04a2\\u04a4\\u04a6\\u04a8\\u04aa\\u04ac\\u04ae\\u04b0\\u04b2\\u04b4\\u04b6\\u04b8\\u04ba\\u04bc\\u04be\\u04c0\\u04c1\\u04c3\\u04c5\\u04c7\\u04c9\\u04cb\\u04cd\\u04d0\\u04d2\\u04d4\\u04d6\\u04d8\\u04da\\u04dc\\u04de\\u04e0\\u04e2\\u04e4\\u04e6\\u04e8\\u04ea\\u04ec\\u04ee\\u04f0\\u04f2\\u04f4\\u04f6\\u04f8\\u0500\\u0502\\u0504\\u0506\\u0508\\u050a\\u050c\\u050e\\u0531\\u0532\\u0533\\u0534\\u0535\\u0536\\u0537\\u0538\\u0539\\u053a\\u053b\\u053c\\u053d\\u053e\\u053f\\u0540\\u0541\\u0542\\u0543\\u0544\\u0545\\u0546\\u0547\\u0548\\u0549\\u054a\\u054b\\u054c\\u054d\\u054e\\u054f\\u0550\\u0551\\u0552\\u0553\\u0554\\u0555\\u0556\\u10a0\\u10a1\\u10a2\\u10a3\\u10a4\\u10a5\\u10a6\\u10a7\\u10a8\\u10a9\\u10aa\\u10ab\\u10ac\\u10ad\\u10ae\\u10af\\u10b0\\u10b1\\u10b2\\u10b3\\u10b4\\u10b5\\u10b6\\u10b7\\u10b8\\u10b9\\u10ba\\u10bb\\u10bc\\u10bd\\u10be\\u10bf\\u10c0\\u10c1\\u10c2\\u10c3\\u10c4\\u10c5\\u1e00\\u1e02\\u1e04\\u1e06\\u1e08\\u1e0a\\u1e0c\\u1e0e\\u1e10\\u1e12\\u1e14\\u1e16\\u1e18\\u1e1a\\u1e1c\\u1e1e\\u1e20\\u1e22\\u1e24\\u1e26\\u1e28\\u1e2a\\u1e2c\\u1e2e\\u1e30\\u1e32\\u1e34\\u1e36\\u1e38\\u1e3a\\u1e3c\\u1e3e\\u1e40\\u1e42\\u1e44\\u1e46\\u1e48\\u1e4a\\u1e4c\\u1e4e\\u1e50\\u1e52\\u1e54\\u1e56\\u1e58\\u1e5a\\u1e5c\\u1e5e\\u1e60\\u1e62\\u1e64\\u1e66\\u1e68\\u1e6a\\u1e6c\\u1e6e\\u1e70\\u1e72\\u1e74\\u1e76\\u1e78\\u1e7a\\u1e7c\\u1e7e\\u1e80\\u1e82\\u1e84\\u1e86\\u1e88\\u1e8a\\u1e8c\\u1e8e\\u1e90\\u1e92\\u1e94\\u1ea0\\u1ea2\\u1ea4\\u1ea6\\u1ea8\\u1eaa\\u1eac\\u1eae\\u1eb0\\u1eb2\\u1eb4\\u1eb6\\u1eb8\\u1eba\\u1ebc\\u1ebe\\u1ec0\\u1ec2\\u1ec4\\u1ec6\\u1ec8\\u1eca\\u1ecc\\u1ece\\u1ed0\\u1ed2\\u1ed4\\u1ed6\\u1ed8\\u1eda\\u1edc\\u1ede\\u1ee0\\u1ee2\\u1ee4\\u1ee6\\u1ee8\\u1eea\\u1eec\\u1eee\\u1ef0\\u1ef2\\u1ef4\\u1ef6\\u1ef8\\u1f08\\u1f09\\u1f0a\\u1f0b\\u1f0c\\u1f0d\\u1f0e\\u1f0f\\u1f18\\u1f19\\u1f1a\\u1f1b\\u1f1c\\u1f1d\\u1f28\\u1f29\\u1f2a\\u1f2b\\u1f2c\\u1f2d\\u1f2e\\u1f2f\\u1f38\\u1f39\\u1f3a\\u1f3b\\u1f3c\\u1f3d\\u1f3e\\u1f3f\\u1f48\\u1f49\\u1f4a\\u1f4b\\u1f4c\\u1f4d\\u1f59\\u1f5b\\u1f5d\\u1f5f\\u1f68\\u1f69\\u1f6a\\u1f6b\\u1f6c\\u1f6d\\u1f6e\\u1f6f\\u1fb8\\u1fb9\\u1fba\\u1fbb\\u1fc8\\u1fc9\\u1fca\\u1fcb\\u1fd8\\u1fd9\\u1fda\\u1fdb\\u1fe8\\u1fe9\\u1fea\\u1feb\\u1fec\\u1ff8\\u1ff9\\u1ffa\\u1ffb\\u2102\\u2107\\u210b\\u210c\\u210d\\u2110\\u2111\\u2112\\u2115\\u2119\\u211a\\u211b\\u211c\\u211d\\u2124\\u2126\\u2128\\u212a\\u212b\\u212c\\u212d\\u2130\\u2131\\u2133\\u213e\\u213f\\u2145\\u2c00\\u2c01\\u2c02\\u2c03\\u2c04\\u2c05\\u2c06\\u2c07\\u2c08\\u2c09\\u2c0a\\u2c0b\\u2c0c\\u2c0d\\u2c0e\\u2c0f\\u2c10\\u2c11\\u2c12\\u2c13\\u2c14\\u2c15\\u2c16\\u2c17\\u2c18\\u2c19\\u2c1a\\u2c1b\\u2c1c\\u2c1d\\u2c1e\\u2c1f\\u2c20\\u2c21\\u2c22\\u2c23\\u2c24\\u2c25\\u2c26\\u2c27\\u2c28\\u2c29\\u2c2a\\u2c2b\\u2c2c\\u2c2d\\u2c2e\\u2c80\\u2c82\\u2c84\\u2c86\\u2c88\\u2c8a\\u2c8c\\u2c8e\\u2c90\\u2c92\\u2c94\\u2c96\\u2c98\\u2c9a\\u2c9c\\u2c9e\\u2ca0\\u2ca2\\u2ca4\\u2ca6\\u2ca8\\u2caa\\u2cac\\u2cae\\u2cb0\\u2cb2\\u2cb4\\u2cb6\\u2cb8\\u2cba\\u2cbc\\u2cbe\\u2cc0\\u2cc2\\u2cc4\\u2cc6\\u2cc8\\u2cca\\u2ccc\\u2cce\\u2cd0\\u2cd2\\u2cd4\\u2cd6\\u2cd8\\u2cda\\u2cdc\\u2cde\\u2ce0\\u2ce2\\uff21\\uff22\\uff23\\uff24\\uff25\\uff26\\uff27\\uff28\\uff29\\uff2a\\uff2b\\uff2c\\uff2d\\uff2e\\uff2f\\uff30\\uff31\\uff32\\uff33\\uff34\\uff35\\uff36\\uff37\\uff38\\uff39\\uff3a'\n\nMc = u'\\u0903\\u093e\\u093f\\u0940\\u0949\\u094a\\u094b\\u094c\\u0982\\u0983\\u09be\\u09bf\\u09c0\\u09c7\\u09c8\\u09cb\\u09cc\\u09d7\\u0a03\\u0a3e\\u0a3f\\u0a40\\u0a83\\u0abe\\u0abf\\u0ac0\\u0ac9\\u0acb\\u0acc\\u0b02\\u0b03\\u0b3e\\u0b40\\u0b47\\u0b48\\u0b4b\\u0b4c\\u0b57\\u0bbe\\u0bbf\\u0bc1\\u0bc2\\u0bc6\\u0bc7\\u0bc8\\u0bca\\u0bcb\\u0bcc\\u0bd7\\u0c01\\u0c02\\u0c03\\u0c41\\u0c42\\u0c43\\u0c44\\u0c82\\u0c83\\u0cbe\\u0cc0\\u0cc1\\u0cc2\\u0cc3\\u0cc4\\u0cc7\\u0cc8\\u0cca\\u0ccb\\u0cd5\\u0cd6\\u0d02\\u0d03\\u0d3e\\u0d3f\\u0d40\\u0d46\\u0d47\\u0d48\\u0d4a\\u0d4b\\u0d4c\\u0d57\\u0d82\\u0d83\\u0dcf\\u0dd0\\u0dd1\\u0dd8\\u0dd9\\u0dda\\u0ddb\\u0ddc\\u0ddd\\u0dde\\u0ddf\\u0df2\\u0df3\\u0f3e\\u0f3f\\u0f7f\\u102c\\u1031\\u1038\\u1056\\u1057\\u17b6\\u17be\\u17bf\\u17c0\\u17c1\\u17c2\\u17c3\\u17c4\\u17c5\\u17c7\\u17c8\\u1923\\u1924\\u1925\\u1926\\u1929\\u192a\\u192b\\u1930\\u1931\\u1933\\u1934\\u1935\\u1936\\u1937\\u1938\\u19b0\\u19b1\\u19b2\\u19b3\\u19b4\\u19b5\\u19b6\\u19b7\\u19b8\\u19b9\\u19ba\\u19bb\\u19bc\\u19bd\\u19be\\u19bf\\u19c0\\u19c8\\u19c9\\u1a19\\u1a1a\\u1a1b\\ua802\\ua823\\ua824\\ua827'\n\nMe = u'\\u0488\\u0489\\u06de\\u20dd\\u20de\\u20df\\u20e0\\u20e2\\u20e3\\u20e4'\n\nMn = u'\\u0300\\u0301\\u0302\\u0303\\u0304\\u0305\\u0306\\u0307\\u0308\\u0309\\u030a\\u030b\\u030c\\u030d\\u030e\\u030f\\u0310\\u0311\\u0312\\u0313\\u0314\\u0315\\u0316\\u0317\\u0318\\u0319\\u031a\\u031b\\u031c\\u031d\\u031e\\u031f\\u0320\\u0321\\u0322\\u0323\\u0324\\u0325\\u0326\\u0327\\u0328\\u0329\\u032a\\u032b\\u032c\\u032d\\u032e\\u032f\\u0330\\u0331\\u0332\\u0333\\u0334\\u0335\\u0336\\u0337\\u0338\\u0339\\u033a\\u033b\\u033c\\u033d\\u033e\\u033f\\u0340\\u0341\\u0342\\u0343\\u0344\\u0345\\u0346\\u0347\\u0348\\u0349\\u034a\\u034b\\u034c\\u034d\\u034e\\u034f\\u0350\\u0351\\u0352\\u0353\\u0354\\u0355\\u0356\\u0357\\u0358\\u0359\\u035a\\u035b\\u035c\\u035d\\u035e\\u035f\\u0360\\u0361\\u0362\\u0363\\u0364\\u0365\\u0366\\u0367\\u0368\\u0369\\u036a\\u036b\\u036c\\u036d\\u036e\\u036f\\u0483\\u0484\\u0485\\u0486\\u0591\\u0592\\u0593\\u0594\\u0595\\u0596\\u0597\\u0598\\u0599\\u059a\\u059b\\u059c\\u059d\\u059e\\u059f\\u05a0\\u05a1\\u05a2\\u05a3\\u05a4\\u05a5\\u05a6\\u05a7\\u05a8\\u05a9\\u05aa\\u05ab\\u05ac\\u05ad\\u05ae\\u05af\\u05b0\\u05b1\\u05b2\\u05b3\\u05b4\\u05b5\\u05b6\\u05b7\\u05b8\\u05b9\\u05bb\\u05bc\\u05bd\\u05bf\\u05c1\\u05c2\\u05c4\\u05c5\\u05c7\\u0610\\u0611\\u0612\\u0613\\u0614\\u0615\\u064b\\u064c\\u064d\\u064e\\u064f\\u0650\\u0651\\u0652\\u0653\\u0654\\u0655\\u0656\\u0657\\u0658\\u0659\\u065a\\u065b\\u065c\\u065d\\u065e\\u0670\\u06d6\\u06d7\\u06d8\\u06d9\\u06da\\u06db\\u06dc\\u06df\\u06e0\\u06e1\\u06e2\\u06e3\\u06e4\\u06e7\\u06e8\\u06ea\\u06eb\\u06ec\\u06ed\\u0711\\u0730\\u0731\\u0732\\u0733\\u0734\\u0735\\u0736\\u0737\\u0738\\u0739\\u073a\\u073b\\u073c\\u073d\\u073e\\u073f\\u0740\\u0741\\u0742\\u0743\\u0744\\u0745\\u0746\\u0747\\u0748\\u0749\\u074a\\u07a6\\u07a7\\u07a8\\u07a9\\u07aa\\u07ab\\u07ac\\u07ad\\u07ae\\u07af\\u07b0\\u0901\\u0902\\u093c\\u0941\\u0942\\u0943\\u0944\\u0945\\u0946\\u0947\\u0948\\u094d\\u0951\\u0952\\u0953\\u0954\\u0962\\u0963\\u0981\\u09bc\\u09c1\\u09c2\\u09c3\\u09c4\\u09cd\\u09e2\\u09e3\\u0a01\\u0a02\\u0a3c\\u0a41\\u0a42\\u0a47\\u0a48\\u0a4b\\u0a4c\\u0a4d\\u0a70\\u0a71\\u0a81\\u0a82\\u0abc\\u0ac1\\u0ac2\\u0ac3\\u0ac4\\u0ac5\\u0ac7\\u0ac8\\u0acd\\u0ae2\\u0ae3\\u0b01\\u0b3c\\u0b3f\\u0b41\\u0b42\\u0b43\\u0b4d\\u0b56\\u0b82\\u0bc0\\u0bcd\\u0c3e\\u0c3f\\u0c40\\u0c46\\u0c47\\u0c48\\u0c4a\\u0c4b\\u0c4c\\u0c4d\\u0c55\\u0c56\\u0cbc\\u0cbf\\u0cc6\\u0ccc\\u0ccd\\u0d41\\u0d42\\u0d43\\u0d4d\\u0dca\\u0dd2\\u0dd3\\u0dd4\\u0dd6\\u0e31\\u0e34\\u0e35\\u0e36\\u0e37\\u0e38\\u0e39\\u0e3a\\u0e47\\u0e48\\u0e49\\u0e4a\\u0e4b\\u0e4c\\u0e4d\\u0e4e\\u0eb1\\u0eb4\\u0eb5\\u0eb6\\u0eb7\\u0eb8\\u0eb9\\u0ebb\\u0ebc\\u0ec8\\u0ec9\\u0eca\\u0ecb\\u0ecc\\u0ecd\\u0f18\\u0f19\\u0f35\\u0f37\\u0f39\\u0f71\\u0f72\\u0f73\\u0f74\\u0f75\\u0f76\\u0f77\\u0f78\\u0f79\\u0f7a\\u0f7b\\u0f7c\\u0f7d\\u0f7e\\u0f80\\u0f81\\u0f82\\u0f83\\u0f84\\u0f86\\u0f87\\u0f90\\u0f91\\u0f92\\u0f93\\u0f94\\u0f95\\u0f96\\u0f97\\u0f99\\u0f9a\\u0f9b\\u0f9c\\u0f9d\\u0f9e\\u0f9f\\u0fa0\\u0fa1\\u0fa2\\u0fa3\\u0fa4\\u0fa5\\u0fa6\\u0fa7\\u0fa8\\u0fa9\\u0faa\\u0fab\\u0fac\\u0fad\\u0fae\\u0faf\\u0fb0\\u0fb1\\u0fb2\\u0fb3\\u0fb4\\u0fb5\\u0fb6\\u0fb7\\u0fb8\\u0fb9\\u0fba\\u0fbb\\u0fbc\\u0fc6\\u102d\\u102e\\u102f\\u1030\\u1032\\u1036\\u1037\\u1039\\u1058\\u1059\\u135f\\u1712\\u1713\\u1714\\u1732\\u1733\\u1734\\u1752\\u1753\\u1772\\u1773\\u17b7\\u17b8\\u17b9\\u17ba\\u17bb\\u17bc\\u17bd\\u17c6\\u17c9\\u17ca\\u17cb\\u17cc\\u17cd\\u17ce\\u17cf\\u17d0\\u17d1\\u17d2\\u17d3\\u17dd\\u180b\\u180c\\u180d\\u18a9\\u1920\\u1921\\u1922\\u1927\\u1928\\u1932\\u1939\\u193a\\u193b\\u1a17\\u1a18\\u1dc0\\u1dc1\\u1dc2\\u1dc3\\u20d0\\u20d1\\u20d2\\u20d3\\u20d4\\u20d5\\u20d6\\u20d7\\u20d8\\u20d9\\u20da\\u20db\\u20dc\\u20e1\\u20e5\\u20e6\\u20e7\\u20e8\\u20e9\\u20ea\\u20eb\\u302a\\u302b\\u302c\\u302d\\u302e\\u302f\\u3099\\u309a\\ua806\\ua80b\\ua825\\ua826\\ufb1e\\ufe00\\ufe01\\ufe02\\ufe03\\ufe04\\ufe05\\ufe06\\ufe07\\ufe08\\ufe09\\ufe0a\\ufe0b\\ufe0c\\ufe0d\\ufe0e\\ufe0f\\ufe20\\ufe21\\ufe22\\ufe23'\n\nNd = u'0123456789\\u0660\\u0661\\u0662\\u0663\\u0664\\u0665\\u0666\\u0667\\u0668\\u0669\\u06f0\\u06f1\\u06f2\\u06f3\\u06f4\\u06f5\\u06f6\\u06f7\\u06f8\\u06f9\\u0966\\u0967\\u0968\\u0969\\u096a\\u096b\\u096c\\u096d\\u096e\\u096f\\u09e6\\u09e7\\u09e8\\u09e9\\u09ea\\u09eb\\u09ec\\u09ed\\u09ee\\u09ef\\u0a66\\u0a67\\u0a68\\u0a69\\u0a6a\\u0a6b\\u0a6c\\u0a6d\\u0a6e\\u0a6f\\u0ae6\\u0ae7\\u0ae8\\u0ae9\\u0aea\\u0aeb\\u0aec\\u0aed\\u0aee\\u0aef\\u0b66\\u0b67\\u0b68\\u0b69\\u0b6a\\u0b6b\\u0b6c\\u0b6d\\u0b6e\\u0b6f\\u0be6\\u0be7\\u0be8\\u0be9\\u0bea\\u0beb\\u0bec\\u0bed\\u0bee\\u0bef\\u0c66\\u0c67\\u0c68\\u0c69\\u0c6a\\u0c6b\\u0c6c\\u0c6d\\u0c6e\\u0c6f\\u0ce6\\u0ce7\\u0ce8\\u0ce9\\u0cea\\u0ceb\\u0cec\\u0ced\\u0cee\\u0cef\\u0d66\\u0d67\\u0d68\\u0d69\\u0d6a\\u0d6b\\u0d6c\\u0d6d\\u0d6e\\u0d6f\\u0e50\\u0e51\\u0e52\\u0e53\\u0e54\\u0e55\\u0e56\\u0e57\\u0e58\\u0e59\\u0ed0\\u0ed1\\u0ed2\\u0ed3\\u0ed4\\u0ed5\\u0ed6\\u0ed7\\u0ed8\\u0ed9\\u0f20\\u0f21\\u0f22\\u0f23\\u0f24\\u0f25\\u0f26\\u0f27\\u0f28\\u0f29\\u1040\\u1041\\u1042\\u1043\\u1044\\u1045\\u1046\\u1047\\u1048\\u1049\\u17e0\\u17e1\\u17e2\\u17e3\\u17e4\\u17e5\\u17e6\\u17e7\\u17e8\\u17e9\\u1810\\u1811\\u1812\\u1813\\u1814\\u1815\\u1816\\u1817\\u1818\\u1819\\u1946\\u1947\\u1948\\u1949\\u194a\\u194b\\u194c\\u194d\\u194e\\u194f\\u19d0\\u19d1\\u19d2\\u19d3\\u19d4\\u19d5\\u19d6\\u19d7\\u19d8\\u19d9\\uff10\\uff11\\uff12\\uff13\\uff14\\uff15\\uff16\\uff17\\uff18\\uff19'\n\nNl = u'\\u16ee\\u16ef\\u16f0\\u2160\\u2161\\u2162\\u2163\\u2164\\u2165\\u2166\\u2167\\u2168\\u2169\\u216a\\u216b\\u216c\\u216d\\u216e\\u216f\\u2170\\u2171\\u2172\\u2173\\u2174\\u2175\\u2176\\u2177\\u2178\\u2179\\u217a\\u217b\\u217c\\u217d\\u217e\\u217f\\u2180\\u2181\\u2182\\u2183\\u3007\\u3021\\u3022\\u3023\\u3024\\u3025\\u3026\\u3027\\u3028\\u3029\\u3038\\u3039\\u303a'\n\nNo = u'\\xb2\\xb3\\xb9\\xbc\\xbd\\xbe\\u09f4\\u09f5\\u09f6\\u09f7\\u09f8\\u09f9\\u0bf0\\u0bf1\\u0bf2\\u0f2a\\u0f2b\\u0f2c\\u0f2d\\u0f2e\\u0f2f\\u0f30\\u0f31\\u0f32\\u0f33\\u1369\\u136a\\u136b\\u136c\\u136d\\u136e\\u136f\\u1370\\u1371\\u1372\\u1373\\u1374\\u1375\\u1376\\u1377\\u1378\\u1379\\u137a\\u137b\\u137c\\u17f0\\u17f1\\u17f2\\u17f3\\u17f4\\u17f5\\u17f6\\u17f7\\u17f8\\u17f9\\u2070\\u2074\\u2075\\u2076\\u2077\\u2078\\u2079\\u2080\\u2081\\u2082\\u2083\\u2084\\u2085\\u2086\\u2087\\u2088\\u2089\\u2153\\u2154\\u2155\\u2156\\u2157\\u2158\\u2159\\u215a\\u215b\\u215c\\u215d\\u215e\\u215f\\u2460\\u2461\\u2462\\u2463\\u2464\\u2465\\u2466\\u2467\\u2468\\u2469\\u246a\\u246b\\u246c\\u246d\\u246e\\u246f\\u2470\\u2471\\u2472\\u2473\\u2474\\u2475\\u2476\\u2477\\u2478\\u2479\\u247a\\u247b\\u247c\\u247d\\u247e\\u247f\\u2480\\u2481\\u2482\\u2483\\u2484\\u2485\\u2486\\u2487\\u2488\\u2489\\u248a\\u248b\\u248c\\u248d\\u248e\\u248f\\u2490\\u2491\\u2492\\u2493\\u2494\\u2495\\u2496\\u2497\\u2498\\u2499\\u249a\\u249b\\u24ea\\u24eb\\u24ec\\u24ed\\u24ee\\u24ef\\u24f0\\u24f1\\u24f2\\u24f3\\u24f4\\u24f5\\u24f6\\u24f7\\u24f8\\u24f9\\u24fa\\u24fb\\u24fc\\u24fd\\u24fe\\u24ff\\u2776\\u2777\\u2778\\u2779\\u277a\\u277b\\u277c\\u277d\\u277e\\u277f\\u2780\\u2781\\u2782\\u2783\\u2784\\u2785\\u2786\\u2787\\u2788\\u2789\\u278a\\u278b\\u278c\\u278d\\u278e\\u278f\\u2790\\u2791\\u2792\\u2793\\u2cfd\\u3192\\u3193\\u3194\\u3195\\u3220\\u3221\\u3222\\u3223\\u3224\\u3225\\u3226\\u3227\\u3228\\u3229\\u3251\\u3252\\u3253\\u3254\\u3255\\u3256\\u3257\\u3258\\u3259\\u325a\\u325b\\u325c\\u325d\\u325e\\u325f\\u3280\\u3281\\u3282\\u3283\\u3284\\u3285\\u3286\\u3287\\u3288\\u3289\\u32b1\\u32b2\\u32b3\\u32b4\\u32b5\\u32b6\\u32b7\\u32b8\\u32b9\\u32ba\\u32bb\\u32bc\\u32bd\\u32be\\u32bf'\n\nPc = u'_\\u203f\\u2040\\u2054\\ufe33\\ufe34\\ufe4d\\ufe4e\\ufe4f\\uff3f'\n\nPd = u'-\\u058a\\u1806\\u2010\\u2011\\u2012\\u2013\\u2014\\u2015\\u2e17\\u301c\\u3030\\u30a0\\ufe31\\ufe32\\ufe58\\ufe63\\uff0d'\n\nPe = u')]}\\u0f3b\\u0f3d\\u169c\\u2046\\u207e\\u208e\\u232a\\u23b5\\u2769\\u276b\\u276d\\u276f\\u2771\\u2773\\u2775\\u27c6\\u27e7\\u27e9\\u27eb\\u2984\\u2986\\u2988\\u298a\\u298c\\u298e\\u2990\\u2992\\u2994\\u2996\\u2998\\u29d9\\u29db\\u29fd\\u3009\\u300b\\u300d\\u300f\\u3011\\u3015\\u3017\\u3019\\u301b\\u301e\\u301f\\ufd3f\\ufe18\\ufe36\\ufe38\\ufe3a\\ufe3c\\ufe3e\\ufe40\\ufe42\\ufe44\\ufe48\\ufe5a\\ufe5c\\ufe5e\\uff09\\uff3d\\uff5d\\uff60\\uff63'\n\nPf = u'\\xbb\\u2019\\u201d\\u203a\\u2e03\\u2e05\\u2e0a\\u2e0d\\u2e1d'\n\nPi = u'\\xab\\u2018\\u201b\\u201c\\u201f\\u2039\\u2e02\\u2e04\\u2e09\\u2e0c\\u2e1c'\n\nPo = u'!\"#%&\\'*,./:;?@\\\\\\xa1\\xb7\\xbf\\u037e\\u0387\\u055a\\u055b\\u055c\\u055d\\u055e\\u055f\\u0589\\u05be\\u05c0\\u05c3\\u05c6\\u05f3\\u05f4\\u060c\\u060d\\u061b\\u061e\\u061f\\u066a\\u066b\\u066c\\u066d\\u06d4\\u0700\\u0701\\u0702\\u0703\\u0704\\u0705\\u0706\\u0707\\u0708\\u0709\\u070a\\u070b\\u070c\\u070d\\u0964\\u0965\\u0970\\u0df4\\u0e4f\\u0e5a\\u0e5b\\u0f04\\u0f05\\u0f06\\u0f07\\u0f08\\u0f09\\u0f0a\\u0f0b\\u0f0c\\u0f0d\\u0f0e\\u0f0f\\u0f10\\u0f11\\u0f12\\u0f85\\u0fd0\\u0fd1\\u104a\\u104b\\u104c\\u104d\\u104e\\u104f\\u10fb\\u1361\\u1362\\u1363\\u1364\\u1365\\u1366\\u1367\\u1368\\u166d\\u166e\\u16eb\\u16ec\\u16ed\\u1735\\u1736\\u17d4\\u17d5\\u17d6\\u17d8\\u17d9\\u17da\\u1800\\u1801\\u1802\\u1803\\u1804\\u1805\\u1807\\u1808\\u1809\\u180a\\u1944\\u1945\\u19de\\u19df\\u1a1e\\u1a1f\\u2016\\u2017\\u2020\\u2021\\u2022\\u2023\\u2024\\u2025\\u2026\\u2027\\u2030\\u2031\\u2032\\u2033\\u2034\\u2035\\u2036\\u2037\\u2038\\u203b\\u203c\\u203d\\u203e\\u2041\\u2042\\u2043\\u2047\\u2048\\u2049\\u204a\\u204b\\u204c\\u204d\\u204e\\u204f\\u2050\\u2051\\u2053\\u2055\\u2056\\u2057\\u2058\\u2059\\u205a\\u205b\\u205c\\u205d\\u205e\\u23b6\\u2cf9\\u2cfa\\u2cfb\\u2cfc\\u2cfe\\u2cff\\u2e00\\u2e01\\u2e06\\u2e07\\u2e08\\u2e0b\\u2e0e\\u2e0f\\u2e10\\u2e11\\u2e12\\u2e13\\u2e14\\u2e15\\u2e16\\u3001\\u3002\\u3003\\u303d\\u30fb\\ufe10\\ufe11\\ufe12\\ufe13\\ufe14\\ufe15\\ufe16\\ufe19\\ufe30\\ufe45\\ufe46\\ufe49\\ufe4a\\ufe4b\\ufe4c\\ufe50\\ufe51\\ufe52\\ufe54\\ufe55\\ufe56\\ufe57\\ufe5f\\ufe60\\ufe61\\ufe68\\ufe6a\\ufe6b\\uff01\\uff02\\uff03\\uff05\\uff06\\uff07\\uff0a\\uff0c\\uff0e\\uff0f\\uff1a\\uff1b\\uff1f\\uff20\\uff3c\\uff61\\uff64\\uff65'\n\nPs = u'([{\\u0f3a\\u0f3c\\u169b\\u201a\\u201e\\u2045\\u207d\\u208d\\u2329\\u23b4\\u2768\\u276a\\u276c\\u276e\\u2770\\u2772\\u2774\\u27c5\\u27e6\\u27e8\\u27ea\\u2983\\u2985\\u2987\\u2989\\u298b\\u298d\\u298f\\u2991\\u2993\\u2995\\u2997\\u29d8\\u29da\\u29fc\\u3008\\u300a\\u300c\\u300e\\u3010\\u3014\\u3016\\u3018\\u301a\\u301d\\ufd3e\\ufe17\\ufe35\\ufe37\\ufe39\\ufe3b\\ufe3d\\ufe3f\\ufe41\\ufe43\\ufe47\\ufe59\\ufe5b\\ufe5d\\uff08\\uff3b\\uff5b\\uff5f\\uff62'\n\nSc = u'$\\xa2\\xa3\\xa4\\xa5\\u060b\\u09f2\\u09f3\\u0af1\\u0bf9\\u0e3f\\u17db\\u20a0\\u20a1\\u20a2\\u20a3\\u20a4\\u20a5\\u20a6\\u20a7\\u20a8\\u20a9\\u20aa\\u20ab\\u20ac\\u20ad\\u20ae\\u20af\\u20b0\\u20b1\\u20b2\\u20b3\\u20b4\\u20b5\\ufdfc\\ufe69\\uff04\\uffe0\\uffe1\\uffe5\\uffe6'\n\nSk = u'^`\\xa8\\xaf\\xb4\\xb8\\u02c2\\u02c3\\u02c4\\u02c5\\u02d2\\u02d3\\u02d4\\u02d5\\u02d6\\u02d7\\u02d8\\u02d9\\u02da\\u02db\\u02dc\\u02dd\\u02de\\u02df\\u02e5\\u02e6\\u02e7\\u02e8\\u02e9\\u02ea\\u02eb\\u02ec\\u02ed\\u02ef\\u02f0\\u02f1\\u02f2\\u02f3\\u02f4\\u02f5\\u02f6\\u02f7\\u02f8\\u02f9\\u02fa\\u02fb\\u02fc\\u02fd\\u02fe\\u02ff\\u0374\\u0375\\u0384\\u0385\\u1fbd\\u1fbf\\u1fc0\\u1fc1\\u1fcd\\u1fce\\u1fcf\\u1fdd\\u1fde\\u1fdf\\u1fed\\u1fee\\u1fef\\u1ffd\\u1ffe\\u309b\\u309c\\ua700\\ua701\\ua702\\ua703\\ua704\\ua705\\ua706\\ua707\\ua708\\ua709\\ua70a\\ua70b\\ua70c\\ua70d\\ua70e\\ua70f\\ua710\\ua711\\ua712\\ua713\\ua714\\ua715\\ua716\\uff3e\\uff40\\uffe3'\n\nSm = u'+<=>|~\\xac\\xb1\\xd7\\xf7\\u03f6\\u2044\\u2052\\u207a\\u207b\\u207c\\u208a\\u208b\\u208c\\u2140\\u2141\\u2142\\u2143\\u2144\\u214b\\u2190\\u2191\\u2192\\u2193\\u2194\\u219a\\u219b\\u21a0\\u21a3\\u21a6\\u21ae\\u21ce\\u21cf\\u21d2\\u21d4\\u21f4\\u21f5\\u21f6\\u21f7\\u21f8\\u21f9\\u21fa\\u21fb\\u21fc\\u21fd\\u21fe\\u21ff\\u2200\\u2201\\u2202\\u2203\\u2204\\u2205\\u2206\\u2207\\u2208\\u2209\\u220a\\u220b\\u220c\\u220d\\u220e\\u220f\\u2210\\u2211\\u2212\\u2213\\u2214\\u2215\\u2216\\u2217\\u2218\\u2219\\u221a\\u221b\\u221c\\u221d\\u221e\\u221f\\u2220\\u2221\\u2222\\u2223\\u2224\\u2225\\u2226\\u2227\\u2228\\u2229\\u222a\\u222b\\u222c\\u222d\\u222e\\u222f\\u2230\\u2231\\u2232\\u2233\\u2234\\u2235\\u2236\\u2237\\u2238\\u2239\\u223a\\u223b\\u223c\\u223d\\u223e\\u223f\\u2240\\u2241\\u2242\\u2243\\u2244\\u2245\\u2246\\u2247\\u2248\\u2249\\u224a\\u224b\\u224c\\u224d\\u224e\\u224f\\u2250\\u2251\\u2252\\u2253\\u2254\\u2255\\u2256\\u2257\\u2258\\u2259\\u225a\\u225b\\u225c\\u225d\\u225e\\u225f\\u2260\\u2261\\u2262\\u2263\\u2264\\u2265\\u2266\\u2267\\u2268\\u2269\\u226a\\u226b\\u226c\\u226d\\u226e\\u226f\\u2270\\u2271\\u2272\\u2273\\u2274\\u2275\\u2276\\u2277\\u2278\\u2279\\u227a\\u227b\\u227c\\u227d\\u227e\\u227f\\u2280\\u2281\\u2282\\u2283\\u2284\\u2285\\u2286\\u2287\\u2288\\u2289\\u228a\\u228b\\u228c\\u228d\\u228e\\u228f\\u2290\\u2291\\u2292\\u2293\\u2294\\u2295\\u2296\\u2297\\u2298\\u2299\\u229a\\u229b\\u229c\\u229d\\u229e\\u229f\\u22a0\\u22a1\\u22a2\\u22a3\\u22a4\\u22a5\\u22a6\\u22a7\\u22a8\\u22a9\\u22aa\\u22ab\\u22ac\\u22ad\\u22ae\\u22af\\u22b0\\u22b1\\u22b2\\u22b3\\u22b4\\u22b5\\u22b6\\u22b7\\u22b8\\u22b9\\u22ba\\u22bb\\u22bc\\u22bd\\u22be\\u22bf\\u22c0\\u22c1\\u22c2\\u22c3\\u22c4\\u22c5\\u22c6\\u22c7\\u22c8\\u22c9\\u22ca\\u22cb\\u22cc\\u22cd\\u22ce\\u22cf\\u22d0\\u22d1\\u22d2\\u22d3\\u22d4\\u22d5\\u22d6\\u22d7\\u22d8\\u22d9\\u22da\\u22db\\u22dc\\u22dd\\u22de\\u22df\\u22e0\\u22e1\\u22e2\\u22e3\\u22e4\\u22e5\\u22e6\\u22e7\\u22e8\\u22e9\\u22ea\\u22eb\\u22ec\\u22ed\\u22ee\\u22ef\\u22f0\\u22f1\\u22f2\\u22f3\\u22f4\\u22f5\\u22f6\\u22f7\\u22f8\\u22f9\\u22fa\\u22fb\\u22fc\\u22fd\\u22fe\\u22ff\\u2308\\u2309\\u230a\\u230b\\u2320\\u2321\\u237c\\u239b\\u239c\\u239d\\u239e\\u239f\\u23a0\\u23a1\\u23a2\\u23a3\\u23a4\\u23a5\\u23a6\\u23a7\\u23a8\\u23a9\\u23aa\\u23ab\\u23ac\\u23ad\\u23ae\\u23af\\u23b0\\u23b1\\u23b2\\u23b3\\u25b7\\u25c1\\u25f8\\u25f9\\u25fa\\u25fb\\u25fc\\u25fd\\u25fe\\u25ff\\u266f\\u27c0\\u27c1\\u27c2\\u27c3\\u27c4\\u27d0\\u27d1\\u27d2\\u27d3\\u27d4\\u27d5\\u27d6\\u27d7\\u27d8\\u27d9\\u27da\\u27db\\u27dc\\u27dd\\u27de\\u27df\\u27e0\\u27e1\\u27e2\\u27e3\\u27e4\\u27e5\\u27f0\\u27f1\\u27f2\\u27f3\\u27f4\\u27f5\\u27f6\\u27f7\\u27f8\\u27f9\\u27fa\\u27fb\\u27fc\\u27fd\\u27fe\\u27ff\\u2900\\u2901\\u2902\\u2903\\u2904\\u2905\\u2906\\u2907\\u2908\\u2909\\u290a\\u290b\\u290c\\u290d\\u290e\\u290f\\u2910\\u2911\\u2912\\u2913\\u2914\\u2915\\u2916\\u2917\\u2918\\u2919\\u291a\\u291b\\u291c\\u291d\\u291e\\u291f\\u2920\\u2921\\u2922\\u2923\\u2924\\u2925\\u2926\\u2927\\u2928\\u2929\\u292a\\u292b\\u292c\\u292d\\u292e\\u292f\\u2930\\u2931\\u2932\\u2933\\u2934\\u2935\\u2936\\u2937\\u2938\\u2939\\u293a\\u293b\\u293c\\u293d\\u293e\\u293f\\u2940\\u2941\\u2942\\u2943\\u2944\\u2945\\u2946\\u2947\\u2948\\u2949\\u294a\\u294b\\u294c\\u294d\\u294e\\u294f\\u2950\\u2951\\u2952\\u2953\\u2954\\u2955\\u2956\\u2957\\u2958\\u2959\\u295a\\u295b\\u295c\\u295d\\u295e\\u295f\\u2960\\u2961\\u2962\\u2963\\u2964\\u2965\\u2966\\u2967\\u2968\\u2969\\u296a\\u296b\\u296c\\u296d\\u296e\\u296f\\u2970\\u2971\\u2972\\u2973\\u2974\\u2975\\u2976\\u2977\\u2978\\u2979\\u297a\\u297b\\u297c\\u297d\\u297e\\u297f\\u2980\\u2981\\u2982\\u2999\\u299a\\u299b\\u299c\\u299d\\u299e\\u299f\\u29a0\\u29a1\\u29a2\\u29a3\\u29a4\\u29a5\\u29a6\\u29a7\\u29a8\\u29a9\\u29aa\\u29ab\\u29ac\\u29ad\\u29ae\\u29af\\u29b0\\u29b1\\u29b2\\u29b3\\u29b4\\u29b5\\u29b6\\u29b7\\u29b8\\u29b9\\u29ba\\u29bb\\u29bc\\u29bd\\u29be\\u29bf\\u29c0\\u29c1\\u29c2\\u29c3\\u29c4\\u29c5\\u29c6\\u29c7\\u29c8\\u29c9\\u29ca\\u29cb\\u29cc\\u29cd\\u29ce\\u29cf\\u29d0\\u29d1\\u29d2\\u29d3\\u29d4\\u29d5\\u29d6\\u29d7\\u29dc\\u29dd\\u29de\\u29df\\u29e0\\u29e1\\u29e2\\u29e3\\u29e4\\u29e5\\u29e6\\u29e7\\u29e8\\u29e9\\u29ea\\u29eb\\u29ec\\u29ed\\u29ee\\u29ef\\u29f0\\u29f1\\u29f2\\u29f3\\u29f4\\u29f5\\u29f6\\u29f7\\u29f8\\u29f9\\u29fa\\u29fb\\u29fe\\u29ff\\u2a00\\u2a01\\u2a02\\u2a03\\u2a04\\u2a05\\u2a06\\u2a07\\u2a08\\u2a09\\u2a0a\\u2a0b\\u2a0c\\u2a0d\\u2a0e\\u2a0f\\u2a10\\u2a11\\u2a12\\u2a13\\u2a14\\u2a15\\u2a16\\u2a17\\u2a18\\u2a19\\u2a1a\\u2a1b\\u2a1c\\u2a1d\\u2a1e\\u2a1f\\u2a20\\u2a21\\u2a22\\u2a23\\u2a24\\u2a25\\u2a26\\u2a27\\u2a28\\u2a29\\u2a2a\\u2a2b\\u2a2c\\u2a2d\\u2a2e\\u2a2f\\u2a30\\u2a31\\u2a32\\u2a33\\u2a34\\u2a35\\u2a36\\u2a37\\u2a38\\u2a39\\u2a3a\\u2a3b\\u2a3c\\u2a3d\\u2a3e\\u2a3f\\u2a40\\u2a41\\u2a42\\u2a43\\u2a44\\u2a45\\u2a46\\u2a47\\u2a48\\u2a49\\u2a4a\\u2a4b\\u2a4c\\u2a4d\\u2a4e\\u2a4f\\u2a50\\u2a51\\u2a52\\u2a53\\u2a54\\u2a55\\u2a56\\u2a57\\u2a58\\u2a59\\u2a5a\\u2a5b\\u2a5c\\u2a5d\\u2a5e\\u2a5f\\u2a60\\u2a61\\u2a62\\u2a63\\u2a64\\u2a65\\u2a66\\u2a67\\u2a68\\u2a69\\u2a6a\\u2a6b\\u2a6c\\u2a6d\\u2a6e\\u2a6f\\u2a70\\u2a71\\u2a72\\u2a73\\u2a74\\u2a75\\u2a76\\u2a77\\u2a78\\u2a79\\u2a7a\\u2a7b\\u2a7c\\u2a7d\\u2a7e\\u2a7f\\u2a80\\u2a81\\u2a82\\u2a83\\u2a84\\u2a85\\u2a86\\u2a87\\u2a88\\u2a89\\u2a8a\\u2a8b\\u2a8c\\u2a8d\\u2a8e\\u2a8f\\u2a90\\u2a91\\u2a92\\u2a93\\u2a94\\u2a95\\u2a96\\u2a97\\u2a98\\u2a99\\u2a9a\\u2a9b\\u2a9c\\u2a9d\\u2a9e\\u2a9f\\u2aa0\\u2aa1\\u2aa2\\u2aa3\\u2aa4\\u2aa5\\u2aa6\\u2aa7\\u2aa8\\u2aa9\\u2aaa\\u2aab\\u2aac\\u2aad\\u2aae\\u2aaf\\u2ab0\\u2ab1\\u2ab2\\u2ab3\\u2ab4\\u2ab5\\u2ab6\\u2ab7\\u2ab8\\u2ab9\\u2aba\\u2abb\\u2abc\\u2abd\\u2abe\\u2abf\\u2ac0\\u2ac1\\u2ac2\\u2ac3\\u2ac4\\u2ac5\\u2ac6\\u2ac7\\u2ac8\\u2ac9\\u2aca\\u2acb\\u2acc\\u2acd\\u2ace\\u2acf\\u2ad0\\u2ad1\\u2ad2\\u2ad3\\u2ad4\\u2ad5\\u2ad6\\u2ad7\\u2ad8\\u2ad9\\u2ada\\u2adb\\u2adc\\u2add\\u2ade\\u2adf\\u2ae0\\u2ae1\\u2ae2\\u2ae3\\u2ae4\\u2ae5\\u2ae6\\u2ae7\\u2ae8\\u2ae9\\u2aea\\u2aeb\\u2aec\\u2aed\\u2aee\\u2aef\\u2af0\\u2af1\\u2af2\\u2af3\\u2af4\\u2af5\\u2af6\\u2af7\\u2af8\\u2af9\\u2afa\\u2afb\\u2afc\\u2afd\\u2afe\\u2aff\\ufb29\\ufe62\\ufe64\\ufe65\\ufe66\\uff0b\\uff1c\\uff1d\\uff1e\\uff5c\\uff5e\\uffe2\\uffe9\\uffea\\uffeb\\uffec'\n\nSo = u'\\xa6\\xa7\\xa9\\xae\\xb0\\xb6\\u0482\\u060e\\u060f\\u06e9\\u06fd\\u06fe\\u09fa\\u0b70\\u0bf3\\u0bf4\\u0bf5\\u0bf6\\u0bf7\\u0bf8\\u0bfa\\u0f01\\u0f02\\u0f03\\u0f13\\u0f14\\u0f15\\u0f16\\u0f17\\u0f1a\\u0f1b\\u0f1c\\u0f1d\\u0f1e\\u0f1f\\u0f34\\u0f36\\u0f38\\u0fbe\\u0fbf\\u0fc0\\u0fc1\\u0fc2\\u0fc3\\u0fc4\\u0fc5\\u0fc7\\u0fc8\\u0fc9\\u0fca\\u0fcb\\u0fcc\\u0fcf\\u1360\\u1390\\u1391\\u1392\\u1393\\u1394\\u1395\\u1396\\u1397\\u1398\\u1399\\u1940\\u19e0\\u19e1\\u19e2\\u19e3\\u19e4\\u19e5\\u19e6\\u19e7\\u19e8\\u19e9\\u19ea\\u19eb\\u19ec\\u19ed\\u19ee\\u19ef\\u19f0\\u19f1\\u19f2\\u19f3\\u19f4\\u19f5\\u19f6\\u19f7\\u19f8\\u19f9\\u19fa\\u19fb\\u19fc\\u19fd\\u19fe\\u19ff\\u2100\\u2101\\u2103\\u2104\\u2105\\u2106\\u2108\\u2109\\u2114\\u2116\\u2117\\u2118\\u211e\\u211f\\u2120\\u2121\\u2122\\u2123\\u2125\\u2127\\u2129\\u212e\\u2132\\u213a\\u213b\\u214a\\u214c\\u2195\\u2196\\u2197\\u2198\\u2199\\u219c\\u219d\\u219e\\u219f\\u21a1\\u21a2\\u21a4\\u21a5\\u21a7\\u21a8\\u21a9\\u21aa\\u21ab\\u21ac\\u21ad\\u21af\\u21b0\\u21b1\\u21b2\\u21b3\\u21b4\\u21b5\\u21b6\\u21b7\\u21b8\\u21b9\\u21ba\\u21bb\\u21bc\\u21bd\\u21be\\u21bf\\u21c0\\u21c1\\u21c2\\u21c3\\u21c4\\u21c5\\u21c6\\u21c7\\u21c8\\u21c9\\u21ca\\u21cb\\u21cc\\u21cd\\u21d0\\u21d1\\u21d3\\u21d5\\u21d6\\u21d7\\u21d8\\u21d9\\u21da\\u21db\\u21dc\\u21dd\\u21de\\u21df\\u21e0\\u21e1\\u21e2\\u21e3\\u21e4\\u21e5\\u21e6\\u21e7\\u21e8\\u21e9\\u21ea\\u21eb\\u21ec\\u21ed\\u21ee\\u21ef\\u21f0\\u21f1\\u21f2\\u21f3\\u2300\\u2301\\u2302\\u2303\\u2304\\u2305\\u2306\\u2307\\u230c\\u230d\\u230e\\u230f\\u2310\\u2311\\u2312\\u2313\\u2314\\u2315\\u2316\\u2317\\u2318\\u2319\\u231a\\u231b\\u231c\\u231d\\u231e\\u231f\\u2322\\u2323\\u2324\\u2325\\u2326\\u2327\\u2328\\u232b\\u232c\\u232d\\u232e\\u232f\\u2330\\u2331\\u2332\\u2333\\u2334\\u2335\\u2336\\u2337\\u2338\\u2339\\u233a\\u233b\\u233c\\u233d\\u233e\\u233f\\u2340\\u2341\\u2342\\u2343\\u2344\\u2345\\u2346\\u2347\\u2348\\u2349\\u234a\\u234b\\u234c\\u234d\\u234e\\u234f\\u2350\\u2351\\u2352\\u2353\\u2354\\u2355\\u2356\\u2357\\u2358\\u2359\\u235a\\u235b\\u235c\\u235d\\u235e\\u235f\\u2360\\u2361\\u2362\\u2363\\u2364\\u2365\\u2366\\u2367\\u2368\\u2369\\u236a\\u236b\\u236c\\u236d\\u236e\\u236f\\u2370\\u2371\\u2372\\u2373\\u2374\\u2375\\u2376\\u2377\\u2378\\u2379\\u237a\\u237b\\u237d\\u237e\\u237f\\u2380\\u2381\\u2382\\u2383\\u2384\\u2385\\u2386\\u2387\\u2388\\u2389\\u238a\\u238b\\u238c\\u238d\\u238e\\u238f\\u2390\\u2391\\u2392\\u2393\\u2394\\u2395\\u2396\\u2397\\u2398\\u2399\\u239a\\u23b7\\u23b8\\u23b9\\u23ba\\u23bb\\u23bc\\u23bd\\u23be\\u23bf\\u23c0\\u23c1\\u23c2\\u23c3\\u23c4\\u23c5\\u23c6\\u23c7\\u23c8\\u23c9\\u23ca\\u23cb\\u23cc\\u23cd\\u23ce\\u23cf\\u23d0\\u23d1\\u23d2\\u23d3\\u23d4\\u23d5\\u23d6\\u23d7\\u23d8\\u23d9\\u23da\\u23db\\u2400\\u2401\\u2402\\u2403\\u2404\\u2405\\u2406\\u2407\\u2408\\u2409\\u240a\\u240b\\u240c\\u240d\\u240e\\u240f\\u2410\\u2411\\u2412\\u2413\\u2414\\u2415\\u2416\\u2417\\u2418\\u2419\\u241a\\u241b\\u241c\\u241d\\u241e\\u241f\\u2420\\u2421\\u2422\\u2423\\u2424\\u2425\\u2426\\u2440\\u2441\\u2442\\u2443\\u2444\\u2445\\u2446\\u2447\\u2448\\u2449\\u244a\\u249c\\u249d\\u249e\\u249f\\u24a0\\u24a1\\u24a2\\u24a3\\u24a4\\u24a5\\u24a6\\u24a7\\u24a8\\u24a9\\u24aa\\u24ab\\u24ac\\u24ad\\u24ae\\u24af\\u24b0\\u24b1\\u24b2\\u24b3\\u24b4\\u24b5\\u24b6\\u24b7\\u24b8\\u24b9\\u24ba\\u24bb\\u24bc\\u24bd\\u24be\\u24bf\\u24c0\\u24c1\\u24c2\\u24c3\\u24c4\\u24c5\\u24c6\\u24c7\\u24c8\\u24c9\\u24ca\\u24cb\\u24cc\\u24cd\\u24ce\\u24cf\\u24d0\\u24d1\\u24d2\\u24d3\\u24d4\\u24d5\\u24d6\\u24d7\\u24d8\\u24d9\\u24da\\u24db\\u24dc\\u24dd\\u24de\\u24df\\u24e0\\u24e1\\u24e2\\u24e3\\u24e4\\u24e5\\u24e6\\u24e7\\u24e8\\u24e9\\u2500\\u2501\\u2502\\u2503\\u2504\\u2505\\u2506\\u2507\\u2508\\u2509\\u250a\\u250b\\u250c\\u250d\\u250e\\u250f\\u2510\\u2511\\u2512\\u2513\\u2514\\u2515\\u2516\\u2517\\u2518\\u2519\\u251a\\u251b\\u251c\\u251d\\u251e\\u251f\\u2520\\u2521\\u2522\\u2523\\u2524\\u2525\\u2526\\u2527\\u2528\\u2529\\u252a\\u252b\\u252c\\u252d\\u252e\\u252f\\u2530\\u2531\\u2532\\u2533\\u2534\\u2535\\u2536\\u2537\\u2538\\u2539\\u253a\\u253b\\u253c\\u253d\\u253e\\u253f\\u2540\\u2541\\u2542\\u2543\\u2544\\u2545\\u2546\\u2547\\u2548\\u2549\\u254a\\u254b\\u254c\\u254d\\u254e\\u254f\\u2550\\u2551\\u2552\\u2553\\u2554\\u2555\\u2556\\u2557\\u2558\\u2559\\u255a\\u255b\\u255c\\u255d\\u255e\\u255f\\u2560\\u2561\\u2562\\u2563\\u2564\\u2565\\u2566\\u2567\\u2568\\u2569\\u256a\\u256b\\u256c\\u256d\\u256e\\u256f\\u2570\\u2571\\u2572\\u2573\\u2574\\u2575\\u2576\\u2577\\u2578\\u2579\\u257a\\u257b\\u257c\\u257d\\u257e\\u257f\\u2580\\u2581\\u2582\\u2583\\u2584\\u2585\\u2586\\u2587\\u2588\\u2589\\u258a\\u258b\\u258c\\u258d\\u258e\\u258f\\u2590\\u2591\\u2592\\u2593\\u2594\\u2595\\u2596\\u2597\\u2598\\u2599\\u259a\\u259b\\u259c\\u259d\\u259e\\u259f\\u25a0\\u25a1\\u25a2\\u25a3\\u25a4\\u25a5\\u25a6\\u25a7\\u25a8\\u25a9\\u25aa\\u25ab\\u25ac\\u25ad\\u25ae\\u25af\\u25b0\\u25b1\\u25b2\\u25b3\\u25b4\\u25b5\\u25b6\\u25b8\\u25b9\\u25ba\\u25bb\\u25bc\\u25bd\\u25be\\u25bf\\u25c0\\u25c2\\u25c3\\u25c4\\u25c5\\u25c6\\u25c7\\u25c8\\u25c9\\u25ca\\u25cb\\u25cc\\u25cd\\u25ce\\u25cf\\u25d0\\u25d1\\u25d2\\u25d3\\u25d4\\u25d5\\u25d6\\u25d7\\u25d8\\u25d9\\u25da\\u25db\\u25dc\\u25dd\\u25de\\u25df\\u25e0\\u25e1\\u25e2\\u25e3\\u25e4\\u25e5\\u25e6\\u25e7\\u25e8\\u25e9\\u25ea\\u25eb\\u25ec\\u25ed\\u25ee\\u25ef\\u25f0\\u25f1\\u25f2\\u25f3\\u25f4\\u25f5\\u25f6\\u25f7\\u2600\\u2601\\u2602\\u2603\\u2604\\u2605\\u2606\\u2607\\u2608\\u2609\\u260a\\u260b\\u260c\\u260d\\u260e\\u260f\\u2610\\u2611\\u2612\\u2613\\u2614\\u2615\\u2616\\u2617\\u2618\\u2619\\u261a\\u261b\\u261c\\u261d\\u261e\\u261f\\u2620\\u2621\\u2622\\u2623\\u2624\\u2625\\u2626\\u2627\\u2628\\u2629\\u262a\\u262b\\u262c\\u262d\\u262e\\u262f\\u2630\\u2631\\u2632\\u2633\\u2634\\u2635\\u2636\\u2637\\u2638\\u2639\\u263a\\u263b\\u263c\\u263d\\u263e\\u263f\\u2640\\u2641\\u2642\\u2643\\u2644\\u2645\\u2646\\u2647\\u2648\\u2649\\u264a\\u264b\\u264c\\u264d\\u264e\\u264f\\u2650\\u2651\\u2652\\u2653\\u2654\\u2655\\u2656\\u2657\\u2658\\u2659\\u265a\\u265b\\u265c\\u265d\\u265e\\u265f\\u2660\\u2661\\u2662\\u2663\\u2664\\u2665\\u2666\\u2667\\u2668\\u2669\\u266a\\u266b\\u266c\\u266d\\u266e\\u2670\\u2671\\u2672\\u2673\\u2674\\u2675\\u2676\\u2677\\u2678\\u2679\\u267a\\u267b\\u267c\\u267d\\u267e\\u267f\\u2680\\u2681\\u2682\\u2683\\u2684\\u2685\\u2686\\u2687\\u2688\\u2689\\u268a\\u268b\\u268c\\u268d\\u268e\\u268f\\u2690\\u2691\\u2692\\u2693\\u2694\\u2695\\u2696\\u2697\\u2698\\u2699\\u269a\\u269b\\u269c\\u26a0\\u26a1\\u26a2\\u26a3\\u26a4\\u26a5\\u26a6\\u26a7\\u26a8\\u26a9\\u26aa\\u26ab\\u26ac\\u26ad\\u26ae\\u26af\\u26b0\\u26b1\\u2701\\u2702\\u2703\\u2704\\u2706\\u2707\\u2708\\u2709\\u270c\\u270d\\u270e\\u270f\\u2710\\u2711\\u2712\\u2713\\u2714\\u2715\\u2716\\u2717\\u2718\\u2719\\u271a\\u271b\\u271c\\u271d\\u271e\\u271f\\u2720\\u2721\\u2722\\u2723\\u2724\\u2725\\u2726\\u2727\\u2729\\u272a\\u272b\\u272c\\u272d\\u272e\\u272f\\u2730\\u2731\\u2732\\u2733\\u2734\\u2735\\u2736\\u2737\\u2738\\u2739\\u273a\\u273b\\u273c\\u273d\\u273e\\u273f\\u2740\\u2741\\u2742\\u2743\\u2744\\u2745\\u2746\\u2747\\u2748\\u2749\\u274a\\u274b\\u274d\\u274f\\u2750\\u2751\\u2752\\u2756\\u2758\\u2759\\u275a\\u275b\\u275c\\u275d\\u275e\\u2761\\u2762\\u2763\\u2764\\u2765\\u2766\\u2767\\u2794\\u2798\\u2799\\u279a\\u279b\\u279c\\u279d\\u279e\\u279f\\u27a0\\u27a1\\u27a2\\u27a3\\u27a4\\u27a5\\u27a6\\u27a7\\u27a8\\u27a9\\u27aa\\u27ab\\u27ac\\u27ad\\u27ae\\u27af\\u27b1\\u27b2\\u27b3\\u27b4\\u27b5\\u27b6\\u27b7\\u27b8\\u27b9\\u27ba\\u27bb\\u27bc\\u27bd\\u27be\\u2800\\u2801\\u2802\\u2803\\u2804\\u2805\\u2806\\u2807\\u2808\\u2809\\u280a\\u280b\\u280c\\u280d\\u280e\\u280f\\u2810\\u2811\\u2812\\u2813\\u2814\\u2815\\u2816\\u2817\\u2818\\u2819\\u281a\\u281b\\u281c\\u281d\\u281e\\u281f\\u2820\\u2821\\u2822\\u2823\\u2824\\u2825\\u2826\\u2827\\u2828\\u2829\\u282a\\u282b\\u282c\\u282d\\u282e\\u282f\\u2830\\u2831\\u2832\\u2833\\u2834\\u2835\\u2836\\u2837\\u2838\\u2839\\u283a\\u283b\\u283c\\u283d\\u283e\\u283f\\u2840\\u2841\\u2842\\u2843\\u2844\\u2845\\u2846\\u2847\\u2848\\u2849\\u284a\\u284b\\u284c\\u284d\\u284e\\u284f\\u2850\\u2851\\u2852\\u2853\\u2854\\u2855\\u2856\\u2857\\u2858\\u2859\\u285a\\u285b\\u285c\\u285d\\u285e\\u285f\\u2860\\u2861\\u2862\\u2863\\u2864\\u2865\\u2866\\u2867\\u2868\\u2869\\u286a\\u286b\\u286c\\u286d\\u286e\\u286f\\u2870\\u2871\\u2872\\u2873\\u2874\\u2875\\u2876\\u2877\\u2878\\u2879\\u287a\\u287b\\u287c\\u287d\\u287e\\u287f\\u2880\\u2881\\u2882\\u2883\\u2884\\u2885\\u2886\\u2887\\u2888\\u2889\\u288a\\u288b\\u288c\\u288d\\u288e\\u288f\\u2890\\u2891\\u2892\\u2893\\u2894\\u2895\\u2896\\u2897\\u2898\\u2899\\u289a\\u289b\\u289c\\u289d\\u289e\\u289f\\u28a0\\u28a1\\u28a2\\u28a3\\u28a4\\u28a5\\u28a6\\u28a7\\u28a8\\u28a9\\u28aa\\u28ab\\u28ac\\u28ad\\u28ae\\u28af\\u28b0\\u28b1\\u28b2\\u28b3\\u28b4\\u28b5\\u28b6\\u28b7\\u28b8\\u28b9\\u28ba\\u28bb\\u28bc\\u28bd\\u28be\\u28bf\\u28c0\\u28c1\\u28c2\\u28c3\\u28c4\\u28c5\\u28c6\\u28c7\\u28c8\\u28c9\\u28ca\\u28cb\\u28cc\\u28cd\\u28ce\\u28cf\\u28d0\\u28d1\\u28d2\\u28d3\\u28d4\\u28d5\\u28d6\\u28d7\\u28d8\\u28d9\\u28da\\u28db\\u28dc\\u28dd\\u28de\\u28df\\u28e0\\u28e1\\u28e2\\u28e3\\u28e4\\u28e5\\u28e6\\u28e7\\u28e8\\u28e9\\u28ea\\u28eb\\u28ec\\u28ed\\u28ee\\u28ef\\u28f0\\u28f1\\u28f2\\u28f3\\u28f4\\u28f5\\u28f6\\u28f7\\u28f8\\u28f9\\u28fa\\u28fb\\u28fc\\u28fd\\u28fe\\u28ff\\u2b00\\u2b01\\u2b02\\u2b03\\u2b04\\u2b05\\u2b06\\u2b07\\u2b08\\u2b09\\u2b0a\\u2b0b\\u2b0c\\u2b0d\\u2b0e\\u2b0f\\u2b10\\u2b11\\u2b12\\u2b13\\u2ce5\\u2ce6\\u2ce7\\u2ce8\\u2ce9\\u2cea\\u2e80\\u2e81\\u2e82\\u2e83\\u2e84\\u2e85\\u2e86\\u2e87\\u2e88\\u2e89\\u2e8a\\u2e8b\\u2e8c\\u2e8d\\u2e8e\\u2e8f\\u2e90\\u2e91\\u2e92\\u2e93\\u2e94\\u2e95\\u2e96\\u2e97\\u2e98\\u2e99\\u2e9b\\u2e9c\\u2e9d\\u2e9e\\u2e9f\\u2ea0\\u2ea1\\u2ea2\\u2ea3\\u2ea4\\u2ea5\\u2ea6\\u2ea7\\u2ea8\\u2ea9\\u2eaa\\u2eab\\u2eac\\u2ead\\u2eae\\u2eaf\\u2eb0\\u2eb1\\u2eb2\\u2eb3\\u2eb4\\u2eb5\\u2eb6\\u2eb7\\u2eb8\\u2eb9\\u2eba\\u2ebb\\u2ebc\\u2ebd\\u2ebe\\u2ebf\\u2ec0\\u2ec1\\u2ec2\\u2ec3\\u2ec4\\u2ec5\\u2ec6\\u2ec7\\u2ec8\\u2ec9\\u2eca\\u2ecb\\u2ecc\\u2ecd\\u2ece\\u2ecf\\u2ed0\\u2ed1\\u2ed2\\u2ed3\\u2ed4\\u2ed5\\u2ed6\\u2ed7\\u2ed8\\u2ed9\\u2eda\\u2edb\\u2edc\\u2edd\\u2ede\\u2edf\\u2ee0\\u2ee1\\u2ee2\\u2ee3\\u2ee4\\u2ee5\\u2ee6\\u2ee7\\u2ee8\\u2ee9\\u2eea\\u2eeb\\u2eec\\u2eed\\u2eee\\u2eef\\u2ef0\\u2ef1\\u2ef2\\u2ef3\\u2f00\\u2f01\\u2f02\\u2f03\\u2f04\\u2f05\\u2f06\\u2f07\\u2f08\\u2f09\\u2f0a\\u2f0b\\u2f0c\\u2f0d\\u2f0e\\u2f0f\\u2f10\\u2f11\\u2f12\\u2f13\\u2f14\\u2f15\\u2f16\\u2f17\\u2f18\\u2f19\\u2f1a\\u2f1b\\u2f1c\\u2f1d\\u2f1e\\u2f1f\\u2f20\\u2f21\\u2f22\\u2f23\\u2f24\\u2f25\\u2f26\\u2f27\\u2f28\\u2f29\\u2f2a\\u2f2b\\u2f2c\\u2f2d\\u2f2e\\u2f2f\\u2f30\\u2f31\\u2f32\\u2f33\\u2f34\\u2f35\\u2f36\\u2f37\\u2f38\\u2f39\\u2f3a\\u2f3b\\u2f3c\\u2f3d\\u2f3e\\u2f3f\\u2f40\\u2f41\\u2f42\\u2f43\\u2f44\\u2f45\\u2f46\\u2f47\\u2f48\\u2f49\\u2f4a\\u2f4b\\u2f4c\\u2f4d\\u2f4e\\u2f4f\\u2f50\\u2f51\\u2f52\\u2f53\\u2f54\\u2f55\\u2f56\\u2f57\\u2f58\\u2f59\\u2f5a\\u2f5b\\u2f5c\\u2f5d\\u2f5e\\u2f5f\\u2f60\\u2f61\\u2f62\\u2f63\\u2f64\\u2f65\\u2f66\\u2f67\\u2f68\\u2f69\\u2f6a\\u2f6b\\u2f6c\\u2f6d\\u2f6e\\u2f6f\\u2f70\\u2f71\\u2f72\\u2f73\\u2f74\\u2f75\\u2f76\\u2f77\\u2f78\\u2f79\\u2f7a\\u2f7b\\u2f7c\\u2f7d\\u2f7e\\u2f7f\\u2f80\\u2f81\\u2f82\\u2f83\\u2f84\\u2f85\\u2f86\\u2f87\\u2f88\\u2f89\\u2f8a\\u2f8b\\u2f8c\\u2f8d\\u2f8e\\u2f8f\\u2f90\\u2f91\\u2f92\\u2f93\\u2f94\\u2f95\\u2f96\\u2f97\\u2f98\\u2f99\\u2f9a\\u2f9b\\u2f9c\\u2f9d\\u2f9e\\u2f9f\\u2fa0\\u2fa1\\u2fa2\\u2fa3\\u2fa4\\u2fa5\\u2fa6\\u2fa7\\u2fa8\\u2fa9\\u2faa\\u2fab\\u2fac\\u2fad\\u2fae\\u2faf\\u2fb0\\u2fb1\\u2fb2\\u2fb3\\u2fb4\\u2fb5\\u2fb6\\u2fb7\\u2fb8\\u2fb9\\u2fba\\u2fbb\\u2fbc\\u2fbd\\u2fbe\\u2fbf\\u2fc0\\u2fc1\\u2fc2\\u2fc3\\u2fc4\\u2fc5\\u2fc6\\u2fc7\\u2fc8\\u2fc9\\u2fca\\u2fcb\\u2fcc\\u2fcd\\u2fce\\u2fcf\\u2fd0\\u2fd1\\u2fd2\\u2fd3\\u2fd4\\u2fd5\\u2ff0\\u2ff1\\u2ff2\\u2ff3\\u2ff4\\u2ff5\\u2ff6\\u2ff7\\u2ff8\\u2ff9\\u2ffa\\u2ffb\\u3004\\u3012\\u3013\\u3020\\u3036\\u3037\\u303e\\u303f\\u3190\\u3191\\u3196\\u3197\\u3198\\u3199\\u319a\\u319b\\u319c\\u319d\\u319e\\u319f\\u31c0\\u31c1\\u31c2\\u31c3\\u31c4\\u31c5\\u31c6\\u31c7\\u31c8\\u31c9\\u31ca\\u31cb\\u31cc\\u31cd\\u31ce\\u31cf\\u3200\\u3201\\u3202\\u3203\\u3204\\u3205\\u3206\\u3207\\u3208\\u3209\\u320a\\u320b\\u320c\\u320d\\u320e\\u320f\\u3210\\u3211\\u3212\\u3213\\u3214\\u3215\\u3216\\u3217\\u3218\\u3219\\u321a\\u321b\\u321c\\u321d\\u321e\\u322a\\u322b\\u322c\\u322d\\u322e\\u322f\\u3230\\u3231\\u3232\\u3233\\u3234\\u3235\\u3236\\u3237\\u3238\\u3239\\u323a\\u323b\\u323c\\u323d\\u323e\\u323f\\u3240\\u3241\\u3242\\u3243\\u3250\\u3260\\u3261\\u3262\\u3263\\u3264\\u3265\\u3266\\u3267\\u3268\\u3269\\u326a\\u326b\\u326c\\u326d\\u326e\\u326f\\u3270\\u3271\\u3272\\u3273\\u3274\\u3275\\u3276\\u3277\\u3278\\u3279\\u327a\\u327b\\u327c\\u327d\\u327e\\u327f\\u328a\\u328b\\u328c\\u328d\\u328e\\u328f\\u3290\\u3291\\u3292\\u3293\\u3294\\u3295\\u3296\\u3297\\u3298\\u3299\\u329a\\u329b\\u329c\\u329d\\u329e\\u329f\\u32a0\\u32a1\\u32a2\\u32a3\\u32a4\\u32a5\\u32a6\\u32a7\\u32a8\\u32a9\\u32aa\\u32ab\\u32ac\\u32ad\\u32ae\\u32af\\u32b0\\u32c0\\u32c1\\u32c2\\u32c3\\u32c4\\u32c5\\u32c6\\u32c7\\u32c8\\u32c9\\u32ca\\u32cb\\u32cc\\u32cd\\u32ce\\u32cf\\u32d0\\u32d1\\u32d2\\u32d3\\u32d4\\u32d5\\u32d6\\u32d7\\u32d8\\u32d9\\u32da\\u32db\\u32dc\\u32dd\\u32de\\u32df\\u32e0\\u32e1\\u32e2\\u32e3\\u32e4\\u32e5\\u32e6\\u32e7\\u32e8\\u32e9\\u32ea\\u32eb\\u32ec\\u32ed\\u32ee\\u32ef\\u32f0\\u32f1\\u32f2\\u32f3\\u32f4\\u32f5\\u32f6\\u32f7\\u32f8\\u32f9\\u32fa\\u32fb\\u32fc\\u32fd\\u32fe\\u3300\\u3301\\u3302\\u3303\\u3304\\u3305\\u3306\\u3307\\u3308\\u3309\\u330a\\u330b\\u330c\\u330d\\u330e\\u330f\\u3310\\u3311\\u3312\\u3313\\u3314\\u3315\\u3316\\u3317\\u3318\\u3319\\u331a\\u331b\\u331c\\u331d\\u331e\\u331f\\u3320\\u3321\\u3322\\u3323\\u3324\\u3325\\u3326\\u3327\\u3328\\u3329\\u332a\\u332b\\u332c\\u332d\\u332e\\u332f\\u3330\\u3331\\u3332\\u3333\\u3334\\u3335\\u3336\\u3337\\u3338\\u3339\\u333a\\u333b\\u333c\\u333d\\u333e\\u333f\\u3340\\u3341\\u3342\\u3343\\u3344\\u3345\\u3346\\u3347\\u3348\\u3349\\u334a\\u334b\\u334c\\u334d\\u334e\\u334f\\u3350\\u3351\\u3352\\u3353\\u3354\\u3355\\u3356\\u3357\\u3358\\u3359\\u335a\\u335b\\u335c\\u335d\\u335e\\u335f\\u3360\\u3361\\u3362\\u3363\\u3364\\u3365\\u3366\\u3367\\u3368\\u3369\\u336a\\u336b\\u336c\\u336d\\u336e\\u336f\\u3370\\u3371\\u3372\\u3373\\u3374\\u3375\\u3376\\u3377\\u3378\\u3379\\u337a\\u337b\\u337c\\u337d\\u337e\\u337f\\u3380\\u3381\\u3382\\u3383\\u3384\\u3385\\u3386\\u3387\\u3388\\u3389\\u338a\\u338b\\u338c\\u338d\\u338e\\u338f\\u3390\\u3391\\u3392\\u3393\\u3394\\u3395\\u3396\\u3397\\u3398\\u3399\\u339a\\u339b\\u339c\\u339d\\u339e\\u339f\\u33a0\\u33a1\\u33a2\\u33a3\\u33a4\\u33a5\\u33a6\\u33a7\\u33a8\\u33a9\\u33aa\\u33ab\\u33ac\\u33ad\\u33ae\\u33af\\u33b0\\u33b1\\u33b2\\u33b3\\u33b4\\u33b5\\u33b6\\u33b7\\u33b8\\u33b9\\u33ba\\u33bb\\u33bc\\u33bd\\u33be\\u33bf\\u33c0\\u33c1\\u33c2\\u33c3\\u33c4\\u33c5\\u33c6\\u33c7\\u33c8\\u33c9\\u33ca\\u33cb\\u33cc\\u33cd\\u33ce\\u33cf\\u33d0\\u33d1\\u33d2\\u33d3\\u33d4\\u33d5\\u33d6\\u33d7\\u33d8\\u33d9\\u33da\\u33db\\u33dc\\u33dd\\u33de\\u33df\\u33e0\\u33e1\\u33e2\\u33e3\\u33e4\\u33e5\\u33e6\\u33e7\\u33e8\\u33e9\\u33ea\\u33eb\\u33ec\\u33ed\\u33ee\\u33ef\\u33f0\\u33f1\\u33f2\\u33f3\\u33f4\\u33f5\\u33f6\\u33f7\\u33f8\\u33f9\\u33fa\\u33fb\\u33fc\\u33fd\\u33fe\\u33ff\\u4dc0\\u4dc1\\u4dc2\\u4dc3\\u4dc4\\u4dc5\\u4dc6\\u4dc7\\u4dc8\\u4dc9\\u4dca\\u4dcb\\u4dcc\\u4dcd\\u4dce\\u4dcf\\u4dd0\\u4dd1\\u4dd2\\u4dd3\\u4dd4\\u4dd5\\u4dd6\\u4dd7\\u4dd8\\u4dd9\\u4dda\\u4ddb\\u4ddc\\u4ddd\\u4dde\\u4ddf\\u4de0\\u4de1\\u4de2\\u4de3\\u4de4\\u4de5\\u4de6\\u4de7\\u4de8\\u4de9\\u4dea\\u4deb\\u4dec\\u4ded\\u4dee\\u4def\\u4df0\\u4df1\\u4df2\\u4df3\\u4df4\\u4df5\\u4df6\\u4df7\\u4df8\\u4df9\\u4dfa\\u4dfb\\u4dfc\\u4dfd\\u4dfe\\u4dff\\ua490\\ua491\\ua492\\ua493\\ua494\\ua495\\ua496\\ua497\\ua498\\ua499\\ua49a\\ua49b\\ua49c\\ua49d\\ua49e\\ua49f\\ua4a0\\ua4a1\\ua4a2\\ua4a3\\ua4a4\\ua4a5\\ua4a6\\ua4a7\\ua4a8\\ua4a9\\ua4aa\\ua4ab\\ua4ac\\ua4ad\\ua4ae\\ua4af\\ua4b0\\ua4b1\\ua4b2\\ua4b3\\ua4b4\\ua4b5\\ua4b6\\ua4b7\\ua4b8\\ua4b9\\ua4ba\\ua4bb\\ua4bc\\ua4bd\\ua4be\\ua4bf\\ua4c0\\ua4c1\\ua4c2\\ua4c3\\ua4c4\\ua4c5\\ua4c6\\ua828\\ua829\\ua82a\\ua82b\\ufdfd\\uffe4\\uffe8\\uffed\\uffee\\ufffc\\ufffd'\n\nZl = u'\\u2028'\n\nZp = u'\\u2029'\n\nZs = u' \\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000'\n\ncats = ['Cc', 'Cf', 'Cn', 'Co', 'Cs', 'Ll', 'Lm', 'Lo', 'Lt', 'Lu', 'Mc', 'Me', 'Mn', 'Nd', 'Nl', 'No', 'Pc', 'Pd', 'Pe', 'Pf', 'Pi', 'Po', 'Ps', 'Sc', 'Sk', 'Sm', 'So', 'Zl', 'Zp', 'Zs']\n\ndef combine(*args):\n    return u''.join([globals()[cat] for cat in args])\n\nxid_start = u'\\u0041-\\u005A\\u005F\\u0061-\\u007A\\u00AA\\u00B5\\u00BA\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u01BA\\u01BB\\u01BC-\\u01BF\\u01C0-\\u01C3\\u01C4-\\u0241\\u0250-\\u02AF\\u02B0-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EE\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03CE\\u03D0-\\u03F5\\u03F7-\\u0481\\u048A-\\u04CE\\u04D0-\\u04F9\\u0500-\\u050F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0621-\\u063A\\u0640\\u0641-\\u064A\\u066E-\\u066F\\u0671-\\u06D3\\u06D5\\u06E5-\\u06E6\\u06EE-\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u076D\\u0780-\\u07A5\\u07B1\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u097D\\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\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C33\\u0C35-\\u0C39\\u0C60-\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0-\\u0CE1\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D28\\u0D2A-\\u0D39\\u0D60-\\u0D61\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E40-\\u0E45\\u0E46\\u0E81-\\u0E82\\u0E84\\u0E87-\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA-\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDD\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6A\\u0F88-\\u0F8B\\u1000-\\u1021\\u1023-\\u1027\\u1029-\\u102A\\u1050-\\u1055\\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\\u16EE-\\u16F0\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1842\\u1843\\u1844-\\u1877\\u1880-\\u18A8\\u1900-\\u191C\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19A9\\u19C1-\\u19C7\\u1A00-\\u1A16\\u1D00-\\u1D2B\\u1D2C-\\u1D61\\u1D62-\\u1D77\\u1D78\\u1D79-\\u1D9A\\u1D9B-\\u1DBF\\u1E00-\\u1E9B\\u1EA0-\\u1EF9\\u1F00-\\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\\u2118\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212E\\u212F-\\u2131\\u2133-\\u2134\\u2135-\\u2138\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u2160-\\u2183\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\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\\u3005\\u3006\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303A\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309E\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FE\\u30FF\\u3105-\\u312C\\u3131-\\u318E\\u31A0-\\u31B7\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FBB\\uA000-\\uA014\\uA015\\uA016-\\uA48C\\uA800-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\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-\\uFC5D\\uFC64-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDF9\\uFE71\\uFE73\\uFE77\\uFE79\\uFE7B\\uFE7D\\uFE7F-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFF6F\\uFF70\\uFF71-\\uFF9D\\uFFA0-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC'\n\nxid_continue = u'\\u0030-\\u0039\\u0041-\\u005A\\u005F\\u0061-\\u007A\\u00AA\\u00B5\\u00B7\\u00BA\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u01BA\\u01BB\\u01BC-\\u01BF\\u01C0-\\u01C3\\u01C4-\\u0241\\u0250-\\u02AF\\u02B0-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EE\\u0300-\\u036F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03CE\\u03D0-\\u03F5\\u03F7-\\u0481\\u0483-\\u0486\\u048A-\\u04CE\\u04D0-\\u04F9\\u0500-\\u050F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u0591-\\u05B9\\u05BB-\\u05BD\\u05BF\\u05C1-\\u05C2\\u05C4-\\u05C5\\u05C7\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0610-\\u0615\\u0621-\\u063A\\u0640\\u0641-\\u064A\\u064B-\\u065E\\u0660-\\u0669\\u066E-\\u066F\\u0670\\u0671-\\u06D3\\u06D5\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E5-\\u06E6\\u06E7-\\u06E8\\u06EA-\\u06ED\\u06EE-\\u06EF\\u06F0-\\u06F9\\u06FA-\\u06FC\\u06FF\\u0710\\u0711\\u0712-\\u072F\\u0730-\\u074A\\u074D-\\u076D\\u0780-\\u07A5\\u07A6-\\u07B0\\u07B1\\u0901-\\u0902\\u0903\\u0904-\\u0939\\u093C\\u093D\\u093E-\\u0940\\u0941-\\u0948\\u0949-\\u094C\\u094D\\u0950\\u0951-\\u0954\\u0958-\\u0961\\u0962-\\u0963\\u0966-\\u096F\\u097D\\u0981\\u0982-\\u0983\\u0985-\\u098C\\u098F-\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BC\\u09BD\\u09BE-\\u09C0\\u09C1-\\u09C4\\u09C7-\\u09C8\\u09CB-\\u09CC\\u09CD\\u09CE\\u09D7\\u09DC-\\u09DD\\u09DF-\\u09E1\\u09E2-\\u09E3\\u09E6-\\u09EF\\u09F0-\\u09F1\\u0A01-\\u0A02\\u0A03\\u0A05-\\u0A0A\\u0A0F-\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32-\\u0A33\\u0A35-\\u0A36\\u0A38-\\u0A39\\u0A3C\\u0A3E-\\u0A40\\u0A41-\\u0A42\\u0A47-\\u0A48\\u0A4B-\\u0A4D\\u0A59-\\u0A5C\\u0A5E\\u0A66-\\u0A6F\\u0A70-\\u0A71\\u0A72-\\u0A74\\u0A81-\\u0A82\\u0A83\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2-\\u0AB3\\u0AB5-\\u0AB9\\u0ABC\\u0ABD\\u0ABE-\\u0AC0\\u0AC1-\\u0AC5\\u0AC7-\\u0AC8\\u0AC9\\u0ACB-\\u0ACC\\u0ACD\\u0AD0\\u0AE0-\\u0AE1\\u0AE2-\\u0AE3\\u0AE6-\\u0AEF\\u0B01\\u0B02-\\u0B03\\u0B05-\\u0B0C\\u0B0F-\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32-\\u0B33\\u0B35-\\u0B39\\u0B3C\\u0B3D\\u0B3E\\u0B3F\\u0B40\\u0B41-\\u0B43\\u0B47-\\u0B48\\u0B4B-\\u0B4C\\u0B4D\\u0B56\\u0B57\\u0B5C-\\u0B5D\\u0B5F-\\u0B61\\u0B66-\\u0B6F\\u0B71\\u0B82\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99-\\u0B9A\\u0B9C\\u0B9E-\\u0B9F\\u0BA3-\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BBE-\\u0BBF\\u0BC0\\u0BC1-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCC\\u0BCD\\u0BD7\\u0BE6-\\u0BEF\\u0C01-\\u0C03\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C33\\u0C35-\\u0C39\\u0C3E-\\u0C40\\u0C41-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55-\\u0C56\\u0C60-\\u0C61\\u0C66-\\u0C6F\\u0C82-\\u0C83\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBC\\u0CBD\\u0CBE\\u0CBF\\u0CC0-\\u0CC4\\u0CC6\\u0CC7-\\u0CC8\\u0CCA-\\u0CCB\\u0CCC-\\u0CCD\\u0CD5-\\u0CD6\\u0CDE\\u0CE0-\\u0CE1\\u0CE6-\\u0CEF\\u0D02-\\u0D03\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D28\\u0D2A-\\u0D39\\u0D3E-\\u0D40\\u0D41-\\u0D43\\u0D46-\\u0D48\\u0D4A-\\u0D4C\\u0D4D\\u0D57\\u0D60-\\u0D61\\u0D66-\\u0D6F\\u0D82-\\u0D83\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DCA\\u0DCF-\\u0DD1\\u0DD2-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2-\\u0DF3\\u0E01-\\u0E30\\u0E31\\u0E32-\\u0E33\\u0E34-\\u0E3A\\u0E40-\\u0E45\\u0E46\\u0E47-\\u0E4E\\u0E50-\\u0E59\\u0E81-\\u0E82\\u0E84\\u0E87-\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA-\\u0EAB\\u0EAD-\\u0EB0\\u0EB1\\u0EB2-\\u0EB3\\u0EB4-\\u0EB9\\u0EBB-\\u0EBC\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EC8-\\u0ECD\\u0ED0-\\u0ED9\\u0EDC-\\u0EDD\\u0F00\\u0F18-\\u0F19\\u0F20-\\u0F29\\u0F35\\u0F37\\u0F39\\u0F3E-\\u0F3F\\u0F40-\\u0F47\\u0F49-\\u0F6A\\u0F71-\\u0F7E\\u0F7F\\u0F80-\\u0F84\\u0F86-\\u0F87\\u0F88-\\u0F8B\\u0F90-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u1000-\\u1021\\u1023-\\u1027\\u1029-\\u102A\\u102C\\u102D-\\u1030\\u1031\\u1032\\u1036-\\u1037\\u1038\\u1039\\u1040-\\u1049\\u1050-\\u1055\\u1056-\\u1057\\u1058-\\u1059\\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\\u135F\\u1369-\\u1371\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u1676\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F0\\u1700-\\u170C\\u170E-\\u1711\\u1712-\\u1714\\u1720-\\u1731\\u1732-\\u1734\\u1740-\\u1751\\u1752-\\u1753\\u1760-\\u176C\\u176E-\\u1770\\u1772-\\u1773\\u1780-\\u17B3\\u17B6\\u17B7-\\u17BD\\u17BE-\\u17C5\\u17C6\\u17C7-\\u17C8\\u17C9-\\u17D3\\u17D7\\u17DC\\u17DD\\u17E0-\\u17E9\\u180B-\\u180D\\u1810-\\u1819\\u1820-\\u1842\\u1843\\u1844-\\u1877\\u1880-\\u18A8\\u18A9\\u1900-\\u191C\\u1920-\\u1922\\u1923-\\u1926\\u1927-\\u1928\\u1929-\\u192B\\u1930-\\u1931\\u1932\\u1933-\\u1938\\u1939-\\u193B\\u1946-\\u194F\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19A9\\u19B0-\\u19C0\\u19C1-\\u19C7\\u19C8-\\u19C9\\u19D0-\\u19D9\\u1A00-\\u1A16\\u1A17-\\u1A18\\u1A19-\\u1A1B\\u1D00-\\u1D2B\\u1D2C-\\u1D61\\u1D62-\\u1D77\\u1D78\\u1D79-\\u1D9A\\u1D9B-\\u1DBF\\u1DC0-\\u1DC3\\u1E00-\\u1E9B\\u1EA0-\\u1EF9\\u1F00-\\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\\u203F-\\u2040\\u2054\\u2071\\u207F\\u2090-\\u2094\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20EB\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2118\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212E\\u212F-\\u2131\\u2133-\\u2134\\u2135-\\u2138\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u2160-\\u2183\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\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\\u3005\\u3006\\u3007\\u3021-\\u3029\\u302A-\\u302F\\u3031-\\u3035\\u3038-\\u303A\\u303B\\u303C\\u3041-\\u3096\\u3099-\\u309A\\u309D-\\u309E\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FE\\u30FF\\u3105-\\u312C\\u3131-\\u318E\\u31A0-\\u31B7\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FBB\\uA000-\\uA014\\uA015\\uA016-\\uA48C\\uA800-\\uA801\\uA802\\uA803-\\uA805\\uA806\\uA807-\\uA80A\\uA80B\\uA80C-\\uA822\\uA823-\\uA824\\uA825-\\uA826\\uA827\\uAC00-\\uD7A3\\uF900-\\uFA2D\\uFA30-\\uFA6A\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1E\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40-\\uFB41\\uFB43-\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFC5D\\uFC64-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDF9\\uFE00-\\uFE0F\\uFE20-\\uFE23\\uFE33-\\uFE34\\uFE4D-\\uFE4F\\uFE71\\uFE73\\uFE77\\uFE79\\uFE7B\\uFE7D\\uFE7F-\\uFEFC\\uFF10-\\uFF19\\uFF21-\\uFF3A\\uFF3F\\uFF41-\\uFF5A\\uFF66-\\uFF6F\\uFF70\\uFF71-\\uFF9D\\uFF9E-\\uFF9F\\uFFA0-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC'\n\ndef allexcept(*args):\n    newcats = cats[:]\n    for arg in args:\n        newcats.remove(arg)\n    return u''.join([globals()[cat] for cat in newcats])\n\nif __name__ == '__main__':\n    import unicodedata\n\n    categories = {}\n\n    f = open(__file__.rstrip('co'))\n    try:\n        content = f.read()\n    finally:\n        f.close()\n\n    header = content[:content.find('Cc =')]\n    footer = content[content.find(\"def combine(\"):]\n\n    for code in range(65535):\n        c = unichr(code)\n        cat = unicodedata.category(c)\n        categories.setdefault(cat, []).append(c)\n\n    f = open(__file__, 'w')\n    f.write(header)\n\n    for cat in sorted(categories):\n        val = u''.join(categories[cat])\n        if cat == 'Cs':\n            # Jython can't handle isolated surrogates\n            f.write(\"\"\"\\\ntry:\n    Cs = eval(r\"%r\")\nexcept UnicodeDecodeError:\n    Cs = '' # Jython can't handle isolated surrogates\\n\\n\"\"\" % val)\n        else:\n            f.write('%s = %r\\n\\n' % (cat, val))\n    f.write('cats = %r\\n\\n' % sorted(categories.keys()))\n\n    f.write(footer)\n    f.close()\n"
  },
  {
    "path": "lib/jinja2/bccache.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    jinja2.bccache\n    ~~~~~~~~~~~~~~\n\n    This module implements the bytecode cache system Jinja is optionally\n    using.  This is useful if you have very complex template situations and\n    the compiliation of all those templates slow down your application too\n    much.\n\n    Situations where this is useful are often forking web applications that\n    are initialized on the first request.\n\n    :copyright: (c) 2010 by the Jinja Team.\n    :license: BSD.\n\"\"\"\nfrom os import path, listdir\nimport os\nimport sys\nimport stat\nimport errno\nimport marshal\nimport tempfile\nimport fnmatch\nfrom hashlib import sha1\nfrom jinja2.utils import open_if_exists\nfrom jinja2._compat import BytesIO, pickle, PY2, text_type\n\n\n# marshal works better on 3.x, one hack less required\nif not PY2:\n    marshal_dump = marshal.dump\n    marshal_load = marshal.load\nelse:\n\n    def marshal_dump(code, f):\n        if isinstance(f, file):\n            marshal.dump(code, f)\n        else:\n            f.write(marshal.dumps(code))\n\n    def marshal_load(f):\n        if isinstance(f, file):\n            return marshal.load(f)\n        return marshal.loads(f.read())\n\n\nbc_version = 2\n\n# magic version used to only change with new jinja versions.  With 2.6\n# we change this to also take Python version changes into account.  The\n# reason for this is that Python tends to segfault if fed earlier bytecode\n# versions because someone thought it would be a good idea to reuse opcodes\n# or make Python incompatible with earlier versions.\nbc_magic = 'j2'.encode('ascii') + \\\n    pickle.dumps(bc_version, 2) + \\\n    pickle.dumps((sys.version_info[0] << 24) | sys.version_info[1])\n\n\nclass Bucket(object):\n    \"\"\"Buckets are used to store the bytecode for one template.  It's created\n    and initialized by the bytecode cache and passed to the loading functions.\n\n    The buckets get an internal checksum from the cache assigned and use this\n    to automatically reject outdated cache material.  Individual bytecode\n    cache subclasses don't have to care about cache invalidation.\n    \"\"\"\n\n    def __init__(self, environment, key, checksum):\n        self.environment = environment\n        self.key = key\n        self.checksum = checksum\n        self.reset()\n\n    def reset(self):\n        \"\"\"Resets the bucket (unloads the bytecode).\"\"\"\n        self.code = None\n\n    def load_bytecode(self, f):\n        \"\"\"Loads bytecode from a file or file like object.\"\"\"\n        # make sure the magic header is correct\n        magic = f.read(len(bc_magic))\n        if magic != bc_magic:\n            self.reset()\n            return\n        # the source code of the file changed, we need to reload\n        checksum = pickle.load(f)\n        if self.checksum != checksum:\n            self.reset()\n            return\n        # if marshal_load fails then we need to reload\n        try:\n            self.code = marshal_load(f)\n        except (EOFError, ValueError, TypeError):\n            self.reset()\n            return\n\n    def write_bytecode(self, f):\n        \"\"\"Dump the bytecode into the file or file like object passed.\"\"\"\n        if self.code is None:\n            raise TypeError('can\\'t write empty bucket')\n        f.write(bc_magic)\n        pickle.dump(self.checksum, f, 2)\n        marshal_dump(self.code, f)\n\n    def bytecode_from_string(self, string):\n        \"\"\"Load bytecode from a string.\"\"\"\n        self.load_bytecode(BytesIO(string))\n\n    def bytecode_to_string(self):\n        \"\"\"Return the bytecode as string.\"\"\"\n        out = BytesIO()\n        self.write_bytecode(out)\n        return out.getvalue()\n\n\nclass BytecodeCache(object):\n    \"\"\"To implement your own bytecode cache you have to subclass this class\n    and override :meth:`load_bytecode` and :meth:`dump_bytecode`.  Both of\n    these methods are passed a :class:`~jinja2.bccache.Bucket`.\n\n    A very basic bytecode cache that saves the bytecode on the file system::\n\n        from os import path\n\n        class MyCache(BytecodeCache):\n\n            def __init__(self, directory):\n                self.directory = directory\n\n            def load_bytecode(self, bucket):\n                filename = path.join(self.directory, bucket.key)\n                if path.exists(filename):\n                    with open(filename, 'rb') as f:\n                        bucket.load_bytecode(f)\n\n            def dump_bytecode(self, bucket):\n                filename = path.join(self.directory, bucket.key)\n                with open(filename, 'wb') as f:\n                    bucket.write_bytecode(f)\n\n    A more advanced version of a filesystem based bytecode cache is part of\n    Jinja2.\n    \"\"\"\n\n    def load_bytecode(self, bucket):\n        \"\"\"Subclasses have to override this method to load bytecode into a\n        bucket.  If they are not able to find code in the cache for the\n        bucket, it must not do anything.\n        \"\"\"\n        raise NotImplementedError()\n\n    def dump_bytecode(self, bucket):\n        \"\"\"Subclasses have to override this method to write the bytecode\n        from a bucket back to the cache.  If it unable to do so it must not\n        fail silently but raise an exception.\n        \"\"\"\n        raise NotImplementedError()\n\n    def clear(self):\n        \"\"\"Clears the cache.  This method is not used by Jinja2 but should be\n        implemented to allow applications to clear the bytecode cache used\n        by a particular environment.\n        \"\"\"\n\n    def get_cache_key(self, name, filename=None):\n        \"\"\"Returns the unique hash key for this template name.\"\"\"\n        hash = sha1(name.encode('utf-8'))\n        if filename is not None:\n            filename = '|' + filename\n            if isinstance(filename, text_type):\n                filename = filename.encode('utf-8')\n            hash.update(filename)\n        return hash.hexdigest()\n\n    def get_source_checksum(self, source):\n        \"\"\"Returns a checksum for the source.\"\"\"\n        return sha1(source.encode('utf-8')).hexdigest()\n\n    def get_bucket(self, environment, name, filename, source):\n        \"\"\"Return a cache bucket for the given template.  All arguments are\n        mandatory but filename may be `None`.\n        \"\"\"\n        key = self.get_cache_key(name, filename)\n        checksum = self.get_source_checksum(source)\n        bucket = Bucket(environment, key, checksum)\n        self.load_bytecode(bucket)\n        return bucket\n\n    def set_bucket(self, bucket):\n        \"\"\"Put the bucket into the cache.\"\"\"\n        self.dump_bytecode(bucket)\n\n\nclass FileSystemBytecodeCache(BytecodeCache):\n    \"\"\"A bytecode cache that stores bytecode on the filesystem.  It accepts\n    two arguments: The directory where the cache items are stored and a\n    pattern string that is used to build the filename.\n\n    If no directory is specified a default cache directory is selected.  On\n    Windows the user's temp directory is used, on UNIX systems a directory\n    is created for the user in the system temp directory.\n\n    The pattern can be used to have multiple separate caches operate on the\n    same directory.  The default pattern is ``'__jinja2_%s.cache'``.  ``%s``\n    is replaced with the cache key.\n\n    >>> bcc = FileSystemBytecodeCache('/tmp/jinja_cache', '%s.cache')\n\n    This bytecode cache supports clearing of the cache using the clear method.\n    \"\"\"\n\n    def __init__(self, directory=None, pattern='__jinja2_%s.cache'):\n        if directory is None:\n            directory = self._get_default_cache_dir()\n        self.directory = directory\n        self.pattern = pattern\n\n    def _get_default_cache_dir(self):\n        def _unsafe_dir():\n            raise RuntimeError('Cannot determine safe temp directory.  You '\n                               'need to explicitly provide one.')\n\n        tmpdir = tempfile.gettempdir()\n\n        # On windows the temporary directory is used specific unless\n        # explicitly forced otherwise.  We can just use that.\n        if os.name == 'nt':\n            return tmpdir\n        if not hasattr(os, 'getuid'):\n            _unsafe_dir()\n\n        dirname = '_jinja2-cache-%d' % os.getuid()\n        actual_dir = os.path.join(tmpdir, dirname)\n\n        try:\n            os.mkdir(actual_dir, stat.S_IRWXU)\n        except OSError as e:\n            if e.errno != errno.EEXIST:\n                raise\n        try:\n            os.chmod(actual_dir, stat.S_IRWXU)\n            actual_dir_stat = os.lstat(actual_dir)\n            if actual_dir_stat.st_uid != os.getuid() \\\n               or not stat.S_ISDIR(actual_dir_stat.st_mode) \\\n               or stat.S_IMODE(actual_dir_stat.st_mode) != stat.S_IRWXU:\n                _unsafe_dir()\n        except OSError as e:\n            if e.errno != errno.EEXIST:\n                raise\n\n        actual_dir_stat = os.lstat(actual_dir)\n        if actual_dir_stat.st_uid != os.getuid() \\\n           or not stat.S_ISDIR(actual_dir_stat.st_mode) \\\n           or stat.S_IMODE(actual_dir_stat.st_mode) != stat.S_IRWXU:\n            _unsafe_dir()\n\n        return actual_dir\n\n    def _get_cache_filename(self, bucket):\n        return path.join(self.directory, self.pattern % bucket.key)\n\n    def load_bytecode(self, bucket):\n        f = open_if_exists(self._get_cache_filename(bucket), 'rb')\n        if f is not None:\n            try:\n                bucket.load_bytecode(f)\n            finally:\n                f.close()\n\n    def dump_bytecode(self, bucket):\n        f = open(self._get_cache_filename(bucket), 'wb')\n        try:\n            bucket.write_bytecode(f)\n        finally:\n            f.close()\n\n    def clear(self):\n        # imported lazily here because google app-engine doesn't support\n        # write access on the file system and the function does not exist\n        # normally.\n        from os import remove\n        files = fnmatch.filter(listdir(self.directory), self.pattern % '*')\n        for filename in files:\n            try:\n                remove(path.join(self.directory, filename))\n            except OSError:\n                pass\n\n\nclass MemcachedBytecodeCache(BytecodeCache):\n    \"\"\"This class implements a bytecode cache that uses a memcache cache for\n    storing the information.  It does not enforce a specific memcache library\n    (tummy's memcache or cmemcache) but will accept any class that provides\n    the minimal interface required.\n\n    Libraries compatible with this class:\n\n    -   `werkzeug <http://werkzeug.pocoo.org/>`_.contrib.cache\n    -   `python-memcached <http://www.tummy.com/Community/software/python-memcached/>`_\n    -   `cmemcache <http://gijsbert.org/cmemcache/>`_\n\n    (Unfortunately the django cache interface is not compatible because it\n    does not support storing binary data, only unicode.  You can however pass\n    the underlying cache client to the bytecode cache which is available\n    as `django.core.cache.cache._client`.)\n\n    The minimal interface for the client passed to the constructor is this:\n\n    .. class:: MinimalClientInterface\n\n        .. method:: set(key, value[, timeout])\n\n            Stores the bytecode in the cache.  `value` is a string and\n            `timeout` the timeout of the key.  If timeout is not provided\n            a default timeout or no timeout should be assumed, if it's\n            provided it's an integer with the number of seconds the cache\n            item should exist.\n\n        .. method:: get(key)\n\n            Returns the value for the cache key.  If the item does not\n            exist in the cache the return value must be `None`.\n\n    The other arguments to the constructor are the prefix for all keys that\n    is added before the actual cache key and the timeout for the bytecode in\n    the cache system.  We recommend a high (or no) timeout.\n\n    This bytecode cache does not support clearing of used items in the cache.\n    The clear method is a no-operation function.\n\n    .. versionadded:: 2.7\n       Added support for ignoring memcache errors through the\n       `ignore_memcache_errors` parameter.\n    \"\"\"\n\n    def __init__(self, client, prefix='jinja2/bytecode/', timeout=None,\n                 ignore_memcache_errors=True):\n        self.client = client\n        self.prefix = prefix\n        self.timeout = timeout\n        self.ignore_memcache_errors = ignore_memcache_errors\n\n    def load_bytecode(self, bucket):\n        try:\n            code = self.client.get(self.prefix + bucket.key)\n        except Exception:\n            if not self.ignore_memcache_errors:\n                raise\n            code = None\n        if code is not None:\n            bucket.bytecode_from_string(code)\n\n    def dump_bytecode(self, bucket):\n        args = (self.prefix + bucket.key, bucket.bytecode_to_string())\n        if self.timeout is not None:\n            args += (self.timeout,)\n        try:\n            self.client.set(*args)\n        except Exception:\n            if not self.ignore_memcache_errors:\n                raise\n"
  },
  {
    "path": "lib/jinja2/compiler.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    jinja2.compiler\n    ~~~~~~~~~~~~~~~\n\n    Compiles nodes into python code.\n\n    :copyright: (c) 2010 by the Jinja Team.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nfrom itertools import chain\nfrom copy import deepcopy\nfrom keyword import iskeyword as is_python_keyword\nfrom jinja2 import nodes\nfrom jinja2.nodes import EvalContext\nfrom jinja2.visitor import NodeVisitor\nfrom jinja2.exceptions import TemplateAssertionError\nfrom jinja2.utils import Markup, concat, escape\nfrom jinja2._compat import range_type, text_type, string_types, \\\n     iteritems, NativeStringIO, imap\n\n\noperators = {\n    'eq':       '==',\n    'ne':       '!=',\n    'gt':       '>',\n    'gteq':     '>=',\n    'lt':       '<',\n    'lteq':     '<=',\n    'in':       'in',\n    'notin':    'not in'\n}\n\n# what method to iterate over items do we want to use for dict iteration\n# in generated code?  on 2.x let's go with iteritems, on 3.x with items\nif hasattr(dict, 'iteritems'):\n    dict_item_iter = 'iteritems'\nelse:\n    dict_item_iter = 'items'\n\n\n# does if 0: dummy(x) get us x into the scope?\ndef unoptimize_before_dead_code():\n    x = 42\n    def f():\n        if 0: dummy(x)\n    return f\n\n# The getattr is necessary for pypy which does not set this attribute if\n# no closure is on the function\nunoptimize_before_dead_code = bool(\n    getattr(unoptimize_before_dead_code(), '__closure__', None))\n\n\ndef generate(node, environment, name, filename, stream=None,\n             defer_init=False):\n    \"\"\"Generate the python source for a node tree.\"\"\"\n    if not isinstance(node, nodes.Template):\n        raise TypeError('Can\\'t compile non template nodes')\n    generator = environment.code_generator_class(environment, name, filename,\n                                                 stream, defer_init)\n    generator.visit(node)\n    if stream is None:\n        return generator.stream.getvalue()\n\n\ndef has_safe_repr(value):\n    \"\"\"Does the node have a safe representation?\"\"\"\n    if value is None or value is NotImplemented or value is Ellipsis:\n        return True\n    if isinstance(value, (bool, int, float, complex, range_type,\n            Markup) + string_types):\n        return True\n    if isinstance(value, (tuple, list, set, frozenset)):\n        for item in value:\n            if not has_safe_repr(item):\n                return False\n        return True\n    elif isinstance(value, dict):\n        for key, value in iteritems(value):\n            if not has_safe_repr(key):\n                return False\n            if not has_safe_repr(value):\n                return False\n        return True\n    return False\n\n\ndef find_undeclared(nodes, names):\n    \"\"\"Check if the names passed are accessed undeclared.  The return value\n    is a set of all the undeclared names from the sequence of names found.\n    \"\"\"\n    visitor = UndeclaredNameVisitor(names)\n    try:\n        for node in nodes:\n            visitor.visit(node)\n    except VisitorExit:\n        pass\n    return visitor.undeclared\n\n\nclass Identifiers(object):\n    \"\"\"Tracks the status of identifiers in frames.\"\"\"\n\n    def __init__(self):\n        # variables that are known to be declared (probably from outer\n        # frames or because they are special for the frame)\n        self.declared = set()\n\n        # undeclared variables from outer scopes\n        self.outer_undeclared = set()\n\n        # names that are accessed without being explicitly declared by\n        # this one or any of the outer scopes.  Names can appear both in\n        # declared and undeclared.\n        self.undeclared = set()\n\n        # names that are declared locally\n        self.declared_locally = set()\n\n        # names that are declared by parameters\n        self.declared_parameter = set()\n\n    def add_special(self, name):\n        \"\"\"Register a special name like `loop`.\"\"\"\n        self.undeclared.discard(name)\n        self.declared.add(name)\n\n    def is_declared(self, name):\n        \"\"\"Check if a name is declared in this or an outer scope.\"\"\"\n        if name in self.declared_locally or name in self.declared_parameter:\n            return True\n        return name in self.declared\n\n    def copy(self):\n        return deepcopy(self)\n\n\nclass Frame(object):\n    \"\"\"Holds compile time information for us.\"\"\"\n\n    def __init__(self, eval_ctx, parent=None):\n        self.eval_ctx = eval_ctx\n        self.identifiers = Identifiers()\n\n        # a toplevel frame is the root + soft frames such as if conditions.\n        self.toplevel = False\n\n        # the root frame is basically just the outermost frame, so no if\n        # conditions.  This information is used to optimize inheritance\n        # situations.\n        self.rootlevel = False\n\n        # in some dynamic inheritance situations the compiler needs to add\n        # write tests around output statements.\n        self.require_output_check = parent and parent.require_output_check\n\n        # inside some tags we are using a buffer rather than yield statements.\n        # this for example affects {% filter %} or {% macro %}.  If a frame\n        # is buffered this variable points to the name of the list used as\n        # buffer.\n        self.buffer = None\n\n        # the name of the block we're in, otherwise None.\n        self.block = parent and parent.block or None\n\n        # a set of actually assigned names\n        self.assigned_names = set()\n\n        # the parent of this frame\n        self.parent = parent\n\n        if parent is not None:\n            self.identifiers.declared.update(\n                parent.identifiers.declared |\n                parent.identifiers.declared_parameter |\n                parent.assigned_names\n            )\n            self.identifiers.outer_undeclared.update(\n                parent.identifiers.undeclared -\n                self.identifiers.declared\n            )\n            self.buffer = parent.buffer\n\n    def copy(self):\n        \"\"\"Create a copy of the current one.\"\"\"\n        rv = object.__new__(self.__class__)\n        rv.__dict__.update(self.__dict__)\n        rv.identifiers = object.__new__(self.identifiers.__class__)\n        rv.identifiers.__dict__.update(self.identifiers.__dict__)\n        return rv\n\n    def inspect(self, nodes):\n        \"\"\"Walk the node and check for identifiers.  If the scope is hard (eg:\n        enforce on a python level) overrides from outer scopes are tracked\n        differently.\n        \"\"\"\n        visitor = FrameIdentifierVisitor(self.identifiers)\n        for node in nodes:\n            visitor.visit(node)\n\n    def find_shadowed(self, extra=()):\n        \"\"\"Find all the shadowed names.  extra is an iterable of variables\n        that may be defined with `add_special` which may occour scoped.\n        \"\"\"\n        i = self.identifiers\n        return (i.declared | i.outer_undeclared) & \\\n               (i.declared_locally | i.declared_parameter) | \\\n               set(x for x in extra if i.is_declared(x))\n\n    def inner(self):\n        \"\"\"Return an inner frame.\"\"\"\n        return Frame(self.eval_ctx, self)\n\n    def soft(self):\n        \"\"\"Return a soft frame.  A soft frame may not be modified as\n        standalone thing as it shares the resources with the frame it\n        was created of, but it's not a rootlevel frame any longer.\n        \"\"\"\n        rv = self.copy()\n        rv.rootlevel = False\n        return rv\n\n    __copy__ = copy\n\n\nclass VisitorExit(RuntimeError):\n    \"\"\"Exception used by the `UndeclaredNameVisitor` to signal a stop.\"\"\"\n\n\nclass DependencyFinderVisitor(NodeVisitor):\n    \"\"\"A visitor that collects filter and test calls.\"\"\"\n\n    def __init__(self):\n        self.filters = set()\n        self.tests = set()\n\n    def visit_Filter(self, node):\n        self.generic_visit(node)\n        self.filters.add(node.name)\n\n    def visit_Test(self, node):\n        self.generic_visit(node)\n        self.tests.add(node.name)\n\n    def visit_Block(self, node):\n        \"\"\"Stop visiting at blocks.\"\"\"\n\n\nclass UndeclaredNameVisitor(NodeVisitor):\n    \"\"\"A visitor that checks if a name is accessed without being\n    declared.  This is different from the frame visitor as it will\n    not stop at closure frames.\n    \"\"\"\n\n    def __init__(self, names):\n        self.names = set(names)\n        self.undeclared = set()\n\n    def visit_Name(self, node):\n        if node.ctx == 'load' and node.name in self.names:\n            self.undeclared.add(node.name)\n            if self.undeclared == self.names:\n                raise VisitorExit()\n        else:\n            self.names.discard(node.name)\n\n    def visit_Block(self, node):\n        \"\"\"Stop visiting a blocks.\"\"\"\n\n\nclass FrameIdentifierVisitor(NodeVisitor):\n    \"\"\"A visitor for `Frame.inspect`.\"\"\"\n\n    def __init__(self, identifiers):\n        self.identifiers = identifiers\n\n    def visit_Name(self, node):\n        \"\"\"All assignments to names go through this function.\"\"\"\n        if node.ctx == 'store':\n            self.identifiers.declared_locally.add(node.name)\n        elif node.ctx == 'param':\n            self.identifiers.declared_parameter.add(node.name)\n        elif node.ctx == 'load' and not \\\n             self.identifiers.is_declared(node.name):\n            self.identifiers.undeclared.add(node.name)\n\n    def visit_If(self, node):\n        self.visit(node.test)\n        real_identifiers = self.identifiers\n\n        old_names = real_identifiers.declared_locally | \\\n                    real_identifiers.declared_parameter\n\n        def inner_visit(nodes):\n            if not nodes:\n                return set()\n            self.identifiers = real_identifiers.copy()\n            for subnode in nodes:\n                self.visit(subnode)\n            rv = self.identifiers.declared_locally - old_names\n            # we have to remember the undeclared variables of this branch\n            # because we will have to pull them.\n            real_identifiers.undeclared.update(self.identifiers.undeclared)\n            self.identifiers = real_identifiers\n            return rv\n\n        body = inner_visit(node.body)\n        else_ = inner_visit(node.else_ or ())\n\n        # the differences between the two branches are also pulled as\n        # undeclared variables\n        real_identifiers.undeclared.update(body.symmetric_difference(else_) -\n                                           real_identifiers.declared)\n\n        # remember those that are declared.\n        real_identifiers.declared_locally.update(body | else_)\n\n    def visit_Macro(self, node):\n        self.identifiers.declared_locally.add(node.name)\n\n    def visit_Import(self, node):\n        self.generic_visit(node)\n        self.identifiers.declared_locally.add(node.target)\n\n    def visit_FromImport(self, node):\n        self.generic_visit(node)\n        for name in node.names:\n            if isinstance(name, tuple):\n                self.identifiers.declared_locally.add(name[1])\n            else:\n                self.identifiers.declared_locally.add(name)\n\n    def visit_Assign(self, node):\n        \"\"\"Visit assignments in the correct order.\"\"\"\n        self.visit(node.node)\n        self.visit(node.target)\n\n    def visit_For(self, node):\n        \"\"\"Visiting stops at for blocks.  However the block sequence\n        is visited as part of the outer scope.\n        \"\"\"\n        self.visit(node.iter)\n\n    def visit_CallBlock(self, node):\n        self.visit(node.call)\n\n    def visit_FilterBlock(self, node):\n        self.visit(node.filter)\n\n    def visit_AssignBlock(self, node):\n        \"\"\"Stop visiting at block assigns.\"\"\"\n\n    def visit_Scope(self, node):\n        \"\"\"Stop visiting at scopes.\"\"\"\n\n    def visit_Block(self, node):\n        \"\"\"Stop visiting at blocks.\"\"\"\n\n\nclass CompilerExit(Exception):\n    \"\"\"Raised if the compiler encountered a situation where it just\n    doesn't make sense to further process the code.  Any block that\n    raises such an exception is not further processed.\n    \"\"\"\n\n\nclass CodeGenerator(NodeVisitor):\n\n    def __init__(self, environment, name, filename, stream=None,\n                 defer_init=False):\n        if stream is None:\n            stream = NativeStringIO()\n        self.environment = environment\n        self.name = name\n        self.filename = filename\n        self.stream = stream\n        self.created_block_context = False\n        self.defer_init = defer_init\n\n        # aliases for imports\n        self.import_aliases = {}\n\n        # a registry for all blocks.  Because blocks are moved out\n        # into the global python scope they are registered here\n        self.blocks = {}\n\n        # the number of extends statements so far\n        self.extends_so_far = 0\n\n        # some templates have a rootlevel extends.  In this case we\n        # can safely assume that we're a child template and do some\n        # more optimizations.\n        self.has_known_extends = False\n\n        # the current line number\n        self.code_lineno = 1\n\n        # registry of all filters and tests (global, not block local)\n        self.tests = {}\n        self.filters = {}\n\n        # the debug information\n        self.debug_info = []\n        self._write_debug_info = None\n\n        # the number of new lines before the next write()\n        self._new_lines = 0\n\n        # the line number of the last written statement\n        self._last_line = 0\n\n        # true if nothing was written so far.\n        self._first_write = True\n\n        # used by the `temporary_identifier` method to get new\n        # unique, temporary identifier\n        self._last_identifier = 0\n\n        # the current indentation\n        self._indentation = 0\n\n    # -- Various compilation helpers\n\n    def fail(self, msg, lineno):\n        \"\"\"Fail with a :exc:`TemplateAssertionError`.\"\"\"\n        raise TemplateAssertionError(msg, lineno, self.name, self.filename)\n\n    def temporary_identifier(self):\n        \"\"\"Get a new unique identifier.\"\"\"\n        self._last_identifier += 1\n        return 't_%d' % self._last_identifier\n\n    def buffer(self, frame):\n        \"\"\"Enable buffering for the frame from that point onwards.\"\"\"\n        frame.buffer = self.temporary_identifier()\n        self.writeline('%s = []' % frame.buffer)\n\n    def return_buffer_contents(self, frame):\n        \"\"\"Return the buffer contents of the frame.\"\"\"\n        if frame.eval_ctx.volatile:\n            self.writeline('if context.eval_ctx.autoescape:')\n            self.indent()\n            self.writeline('return Markup(concat(%s))' % frame.buffer)\n            self.outdent()\n            self.writeline('else:')\n            self.indent()\n            self.writeline('return concat(%s)' % frame.buffer)\n            self.outdent()\n        elif frame.eval_ctx.autoescape:\n            self.writeline('return Markup(concat(%s))' % frame.buffer)\n        else:\n            self.writeline('return concat(%s)' % frame.buffer)\n\n    def indent(self):\n        \"\"\"Indent by one.\"\"\"\n        self._indentation += 1\n\n    def outdent(self, step=1):\n        \"\"\"Outdent by step.\"\"\"\n        self._indentation -= step\n\n    def start_write(self, frame, node=None):\n        \"\"\"Yield or write into the frame buffer.\"\"\"\n        if frame.buffer is None:\n            self.writeline('yield ', node)\n        else:\n            self.writeline('%s.append(' % frame.buffer, node)\n\n    def end_write(self, frame):\n        \"\"\"End the writing process started by `start_write`.\"\"\"\n        if frame.buffer is not None:\n            self.write(')')\n\n    def simple_write(self, s, frame, node=None):\n        \"\"\"Simple shortcut for start_write + write + end_write.\"\"\"\n        self.start_write(frame, node)\n        self.write(s)\n        self.end_write(frame)\n\n    def blockvisit(self, nodes, frame):\n        \"\"\"Visit a list of nodes as block in a frame.  If the current frame\n        is no buffer a dummy ``if 0: yield None`` is written automatically\n        unless the force_generator parameter is set to False.\n        \"\"\"\n        if frame.buffer is None:\n            self.writeline('if 0: yield None')\n        else:\n            self.writeline('pass')\n        try:\n            for node in nodes:\n                self.visit(node, frame)\n        except CompilerExit:\n            pass\n\n    def write(self, x):\n        \"\"\"Write a string into the output stream.\"\"\"\n        if self._new_lines:\n            if not self._first_write:\n                self.stream.write('\\n' * self._new_lines)\n                self.code_lineno += self._new_lines\n                if self._write_debug_info is not None:\n                    self.debug_info.append((self._write_debug_info,\n                                            self.code_lineno))\n                    self._write_debug_info = None\n            self._first_write = False\n            self.stream.write('    ' * self._indentation)\n            self._new_lines = 0\n        self.stream.write(x)\n\n    def writeline(self, x, node=None, extra=0):\n        \"\"\"Combination of newline and write.\"\"\"\n        self.newline(node, extra)\n        self.write(x)\n\n    def newline(self, node=None, extra=0):\n        \"\"\"Add one or more newlines before the next write.\"\"\"\n        self._new_lines = max(self._new_lines, 1 + extra)\n        if node is not None and node.lineno != self._last_line:\n            self._write_debug_info = node.lineno\n            self._last_line = node.lineno\n\n    def signature(self, node, frame, extra_kwargs=None):\n        \"\"\"Writes a function call to the stream for the current node.\n        A leading comma is added automatically.  The extra keyword\n        arguments may not include python keywords otherwise a syntax\n        error could occour.  The extra keyword arguments should be given\n        as python dict.\n        \"\"\"\n        # if any of the given keyword arguments is a python keyword\n        # we have to make sure that no invalid call is created.\n        kwarg_workaround = False\n        for kwarg in chain((x.key for x in node.kwargs), extra_kwargs or ()):\n            if is_python_keyword(kwarg):\n                kwarg_workaround = True\n                break\n\n        for arg in node.args:\n            self.write(', ')\n            self.visit(arg, frame)\n\n        if not kwarg_workaround:\n            for kwarg in node.kwargs:\n                self.write(', ')\n                self.visit(kwarg, frame)\n            if extra_kwargs is not None:\n                for key, value in iteritems(extra_kwargs):\n                    self.write(', %s=%s' % (key, value))\n        if node.dyn_args:\n            self.write(', *')\n            self.visit(node.dyn_args, frame)\n\n        if kwarg_workaround:\n            if node.dyn_kwargs is not None:\n                self.write(', **dict({')\n            else:\n                self.write(', **{')\n            for kwarg in node.kwargs:\n                self.write('%r: ' % kwarg.key)\n                self.visit(kwarg.value, frame)\n                self.write(', ')\n            if extra_kwargs is not None:\n                for key, value in iteritems(extra_kwargs):\n                    self.write('%r: %s, ' % (key, value))\n            if node.dyn_kwargs is not None:\n                self.write('}, **')\n                self.visit(node.dyn_kwargs, frame)\n                self.write(')')\n            else:\n                self.write('}')\n\n        elif node.dyn_kwargs is not None:\n            self.write(', **')\n            self.visit(node.dyn_kwargs, frame)\n\n    def pull_locals(self, frame):\n        \"\"\"Pull all the references identifiers into the local scope.\"\"\"\n        for name in frame.identifiers.undeclared:\n            self.writeline('l_%s = context.resolve(%r)' % (name, name))\n\n    def pull_dependencies(self, nodes):\n        \"\"\"Pull all the dependencies.\"\"\"\n        visitor = DependencyFinderVisitor()\n        for node in nodes:\n            visitor.visit(node)\n        for dependency in 'filters', 'tests':\n            mapping = getattr(self, dependency)\n            for name in getattr(visitor, dependency):\n                if name not in mapping:\n                    mapping[name] = self.temporary_identifier()\n                self.writeline('%s = environment.%s[%r]' %\n                               (mapping[name], dependency, name))\n\n    def unoptimize_scope(self, frame):\n        \"\"\"Disable Python optimizations for the frame.\"\"\"\n        # XXX: this is not that nice but it has no real overhead.  It\n        # mainly works because python finds the locals before dead code\n        # is removed.  If that breaks we have to add a dummy function\n        # that just accepts the arguments and does nothing.\n        if frame.identifiers.declared:\n            self.writeline('%sdummy(%s)' % (\n                unoptimize_before_dead_code and 'if 0: ' or '',\n                ', '.join('l_' + name for name in frame.identifiers.declared)\n            ))\n\n    def push_scope(self, frame, extra_vars=()):\n        \"\"\"This function returns all the shadowed variables in a dict\n        in the form name: alias and will write the required assignments\n        into the current scope.  No indentation takes place.\n\n        This also predefines locally declared variables from the loop\n        body because under some circumstances it may be the case that\n\n        `extra_vars` is passed to `Frame.find_shadowed`.\n        \"\"\"\n        aliases = {}\n        for name in frame.find_shadowed(extra_vars):\n            aliases[name] = ident = self.temporary_identifier()\n            self.writeline('%s = l_%s' % (ident, name))\n        to_declare = set()\n        for name in frame.identifiers.declared_locally:\n            if name not in aliases:\n                to_declare.add('l_' + name)\n        if to_declare:\n            self.writeline(' = '.join(to_declare) + ' = missing')\n        return aliases\n\n    def pop_scope(self, aliases, frame):\n        \"\"\"Restore all aliases and delete unused variables.\"\"\"\n        for name, alias in iteritems(aliases):\n            self.writeline('l_%s = %s' % (name, alias))\n        to_delete = set()\n        for name in frame.identifiers.declared_locally:\n            if name not in aliases:\n                to_delete.add('l_' + name)\n        if to_delete:\n            # we cannot use the del statement here because enclosed\n            # scopes can trigger a SyntaxError:\n            #   a = 42; b = lambda: a; del a\n            self.writeline(' = '.join(to_delete) + ' = missing')\n\n    def function_scoping(self, node, frame, children=None,\n                         find_special=True):\n        \"\"\"In Jinja a few statements require the help of anonymous\n        functions.  Those are currently macros and call blocks and in\n        the future also recursive loops.  As there is currently\n        technical limitation that doesn't allow reading and writing a\n        variable in a scope where the initial value is coming from an\n        outer scope, this function tries to fall back with a common\n        error message.  Additionally the frame passed is modified so\n        that the argumetns are collected and callers are looked up.\n\n        This will return the modified frame.\n        \"\"\"\n        # we have to iterate twice over it, make sure that works\n        if children is None:\n            children = node.iter_child_nodes()\n        children = list(children)\n        func_frame = frame.inner()\n        func_frame.inspect(children)\n\n        # variables that are undeclared (accessed before declaration) and\n        # declared locally *and* part of an outside scope raise a template\n        # assertion error. Reason: we can't generate reasonable code from\n        # it without aliasing all the variables.\n        # this could be fixed in Python 3 where we have the nonlocal\n        # keyword or if we switch to bytecode generation\n        overridden_closure_vars = (\n            func_frame.identifiers.undeclared &\n            func_frame.identifiers.declared &\n            (func_frame.identifiers.declared_locally |\n             func_frame.identifiers.declared_parameter)\n        )\n        if overridden_closure_vars:\n            self.fail('It\\'s not possible to set and access variables '\n                      'derived from an outer scope! (affects: %s)' %\n                      ', '.join(sorted(overridden_closure_vars)), node.lineno)\n\n        # remove variables from a closure from the frame's undeclared\n        # identifiers.\n        func_frame.identifiers.undeclared -= (\n            func_frame.identifiers.undeclared &\n            func_frame.identifiers.declared\n        )\n\n        # no special variables for this scope, abort early\n        if not find_special:\n            return func_frame\n\n        func_frame.accesses_kwargs = False\n        func_frame.accesses_varargs = False\n        func_frame.accesses_caller = False\n        func_frame.arguments = args = ['l_' + x.name for x in node.args]\n\n        undeclared = find_undeclared(children, ('caller', 'kwargs', 'varargs'))\n\n        if 'caller' in undeclared:\n            func_frame.accesses_caller = True\n            func_frame.identifiers.add_special('caller')\n            args.append('l_caller')\n        if 'kwargs' in undeclared:\n            func_frame.accesses_kwargs = True\n            func_frame.identifiers.add_special('kwargs')\n            args.append('l_kwargs')\n        if 'varargs' in undeclared:\n            func_frame.accesses_varargs = True\n            func_frame.identifiers.add_special('varargs')\n            args.append('l_varargs')\n        return func_frame\n\n    def macro_body(self, node, frame, children=None):\n        \"\"\"Dump the function def of a macro or call block.\"\"\"\n        frame = self.function_scoping(node, frame, children)\n        # macros are delayed, they never require output checks\n        frame.require_output_check = False\n        args = frame.arguments\n        # XXX: this is an ugly fix for the loop nesting bug\n        # (tests.test_old_bugs.test_loop_call_bug).  This works around\n        # a identifier nesting problem we have in general.  It's just more\n        # likely to happen in loops which is why we work around it.  The\n        # real solution would be \"nonlocal\" all the identifiers that are\n        # leaking into a new python frame and might be used both unassigned\n        # and assigned.\n        if 'loop' in frame.identifiers.declared:\n            args = args + ['l_loop=l_loop']\n        self.writeline('def macro(%s):' % ', '.join(args), node)\n        self.indent()\n        self.buffer(frame)\n        self.pull_locals(frame)\n        self.blockvisit(node.body, frame)\n        self.return_buffer_contents(frame)\n        self.outdent()\n        return frame\n\n    def macro_def(self, node, frame):\n        \"\"\"Dump the macro definition for the def created by macro_body.\"\"\"\n        arg_tuple = ', '.join(repr(x.name) for x in node.args)\n        name = getattr(node, 'name', None)\n        if len(node.args) == 1:\n            arg_tuple += ','\n        self.write('Macro(environment, macro, %r, (%s), (' %\n                   (name, arg_tuple))\n        for arg in node.defaults:\n            self.visit(arg, frame)\n            self.write(', ')\n        self.write('), %r, %r, %r)' % (\n            bool(frame.accesses_kwargs),\n            bool(frame.accesses_varargs),\n            bool(frame.accesses_caller)\n        ))\n\n    def position(self, node):\n        \"\"\"Return a human readable position for the node.\"\"\"\n        rv = 'line %d' % node.lineno\n        if self.name is not None:\n            rv += ' in ' + repr(self.name)\n        return rv\n\n    # -- Statement Visitors\n\n    def visit_Template(self, node, frame=None):\n        assert frame is None, 'no root frame allowed'\n        eval_ctx = EvalContext(self.environment, self.name)\n\n        from jinja2.runtime import __all__ as exported\n        self.writeline('from __future__ import division')\n        self.writeline('from jinja2.runtime import ' + ', '.join(exported))\n        if not unoptimize_before_dead_code:\n            self.writeline('dummy = lambda *x: None')\n\n        # if we want a deferred initialization we cannot move the\n        # environment into a local name\n        envenv = not self.defer_init and ', environment=environment' or ''\n\n        # do we have an extends tag at all?  If not, we can save some\n        # overhead by just not processing any inheritance code.\n        have_extends = node.find(nodes.Extends) is not None\n\n        # find all blocks\n        for block in node.find_all(nodes.Block):\n            if block.name in self.blocks:\n                self.fail('block %r defined twice' % block.name, block.lineno)\n            self.blocks[block.name] = block\n\n        # find all imports and import them\n        for import_ in node.find_all(nodes.ImportedName):\n            if import_.importname not in self.import_aliases:\n                imp = import_.importname\n                self.import_aliases[imp] = alias = self.temporary_identifier()\n                if '.' in imp:\n                    module, obj = imp.rsplit('.', 1)\n                    self.writeline('from %s import %s as %s' %\n                                   (module, obj, alias))\n                else:\n                    self.writeline('import %s as %s' % (imp, alias))\n\n        # add the load name\n        self.writeline('name = %r' % self.name)\n\n        # generate the root render function.\n        self.writeline('def root(context%s):' % envenv, extra=1)\n\n        # process the root\n        frame = Frame(eval_ctx)\n        frame.inspect(node.body)\n        frame.toplevel = frame.rootlevel = True\n        frame.require_output_check = have_extends and not self.has_known_extends\n        self.indent()\n        if have_extends:\n            self.writeline('parent_template = None')\n        if 'self' in find_undeclared(node.body, ('self',)):\n            frame.identifiers.add_special('self')\n            self.writeline('l_self = TemplateReference(context)')\n        self.pull_locals(frame)\n        self.pull_dependencies(node.body)\n        self.blockvisit(node.body, frame)\n        self.outdent()\n\n        # make sure that the parent root is called.\n        if have_extends:\n            if not self.has_known_extends:\n                self.indent()\n                self.writeline('if parent_template is not None:')\n            self.indent()\n            self.writeline('for event in parent_template.'\n                           'root_render_func(context):')\n            self.indent()\n            self.writeline('yield event')\n            self.outdent(2 + (not self.has_known_extends))\n\n        # at this point we now have the blocks collected and can visit them too.\n        for name, block in iteritems(self.blocks):\n            block_frame = Frame(eval_ctx)\n            block_frame.inspect(block.body)\n            block_frame.block = name\n            self.writeline('def block_%s(context%s):' % (name, envenv),\n                           block, 1)\n            self.indent()\n            undeclared = find_undeclared(block.body, ('self', 'super'))\n            if 'self' in undeclared:\n                block_frame.identifiers.add_special('self')\n                self.writeline('l_self = TemplateReference(context)')\n            if 'super' in undeclared:\n                block_frame.identifiers.add_special('super')\n                self.writeline('l_super = context.super(%r, '\n                               'block_%s)' % (name, name))\n            self.pull_locals(block_frame)\n            self.pull_dependencies(block.body)\n            self.blockvisit(block.body, block_frame)\n            self.outdent()\n\n        self.writeline('blocks = {%s}' % ', '.join('%r: block_%s' % (x, x)\n                                                   for x in self.blocks),\n                       extra=1)\n\n        # add a function that returns the debug info\n        self.writeline('debug_info = %r' % '&'.join('%s=%s' % x for x\n                                                    in self.debug_info))\n\n    def visit_Block(self, node, frame):\n        \"\"\"Call a block and register it for the template.\"\"\"\n        level = 1\n        if frame.toplevel:\n            # if we know that we are a child template, there is no need to\n            # check if we are one\n            if self.has_known_extends:\n                return\n            if self.extends_so_far > 0:\n                self.writeline('if parent_template is None:')\n                self.indent()\n                level += 1\n        context = node.scoped and 'context.derived(locals())' or 'context'\n        self.writeline('for event in context.blocks[%r][0](%s):' % (\n                       node.name, context), node)\n        self.indent()\n        self.simple_write('event', frame)\n        self.outdent(level)\n\n    def visit_Extends(self, node, frame):\n        \"\"\"Calls the extender.\"\"\"\n        if not frame.toplevel:\n            self.fail('cannot use extend from a non top-level scope',\n                      node.lineno)\n\n        # if the number of extends statements in general is zero so\n        # far, we don't have to add a check if something extended\n        # the template before this one.\n        if self.extends_so_far > 0:\n\n            # if we have a known extends we just add a template runtime\n            # error into the generated code.  We could catch that at compile\n            # time too, but i welcome it not to confuse users by throwing the\n            # same error at different times just \"because we can\".\n            if not self.has_known_extends:\n                self.writeline('if parent_template is not None:')\n                self.indent()\n            self.writeline('raise TemplateRuntimeError(%r)' %\n                           'extended multiple times')\n\n            # if we have a known extends already we don't need that code here\n            # as we know that the template execution will end here.\n            if self.has_known_extends:\n                raise CompilerExit()\n            else:\n                self.outdent()\n\n        self.writeline('parent_template = environment.get_template(', node)\n        self.visit(node.template, frame)\n        self.write(', %r)' % self.name)\n        self.writeline('for name, parent_block in parent_template.'\n                       'blocks.%s():' % dict_item_iter)\n        self.indent()\n        self.writeline('context.blocks.setdefault(name, []).'\n                       'append(parent_block)')\n        self.outdent()\n\n        # if this extends statement was in the root level we can take\n        # advantage of that information and simplify the generated code\n        # in the top level from this point onwards\n        if frame.rootlevel:\n            self.has_known_extends = True\n\n        # and now we have one more\n        self.extends_so_far += 1\n\n    def visit_Include(self, node, frame):\n        \"\"\"Handles includes.\"\"\"\n        if node.with_context:\n            self.unoptimize_scope(frame)\n        if node.ignore_missing:\n            self.writeline('try:')\n            self.indent()\n\n        func_name = 'get_or_select_template'\n        if isinstance(node.template, nodes.Const):\n            if isinstance(node.template.value, string_types):\n                func_name = 'get_template'\n            elif isinstance(node.template.value, (tuple, list)):\n                func_name = 'select_template'\n        elif isinstance(node.template, (nodes.Tuple, nodes.List)):\n            func_name = 'select_template'\n\n        self.writeline('template = environment.%s(' % func_name, node)\n        self.visit(node.template, frame)\n        self.write(', %r)' % self.name)\n        if node.ignore_missing:\n            self.outdent()\n            self.writeline('except TemplateNotFound:')\n            self.indent()\n            self.writeline('pass')\n            self.outdent()\n            self.writeline('else:')\n            self.indent()\n\n        if node.with_context:\n            self.writeline('for event in template.root_render_func('\n                           'template.new_context(context.parent, True, '\n                           'locals())):')\n        else:\n            self.writeline('for event in template.module._body_stream:')\n\n        self.indent()\n        self.simple_write('event', frame)\n        self.outdent()\n\n        if node.ignore_missing:\n            self.outdent()\n\n    def visit_Import(self, node, frame):\n        \"\"\"Visit regular imports.\"\"\"\n        if node.with_context:\n            self.unoptimize_scope(frame)\n        self.writeline('l_%s = ' % node.target, node)\n        if frame.toplevel:\n            self.write('context.vars[%r] = ' % node.target)\n        self.write('environment.get_template(')\n        self.visit(node.template, frame)\n        self.write(', %r).' % self.name)\n        if node.with_context:\n            self.write('make_module(context.parent, True, locals())')\n        else:\n            self.write('module')\n        if frame.toplevel and not node.target.startswith('_'):\n            self.writeline('context.exported_vars.discard(%r)' % node.target)\n        frame.assigned_names.add(node.target)\n\n    def visit_FromImport(self, node, frame):\n        \"\"\"Visit named imports.\"\"\"\n        self.newline(node)\n        self.write('included_template = environment.get_template(')\n        self.visit(node.template, frame)\n        self.write(', %r).' % self.name)\n        if node.with_context:\n            self.write('make_module(context.parent, True)')\n        else:\n            self.write('module')\n\n        var_names = []\n        discarded_names = []\n        for name in node.names:\n            if isinstance(name, tuple):\n                name, alias = name\n            else:\n                alias = name\n            self.writeline('l_%s = getattr(included_template, '\n                           '%r, missing)' % (alias, name))\n            self.writeline('if l_%s is missing:' % alias)\n            self.indent()\n            self.writeline('l_%s = environment.undefined(%r %% '\n                           'included_template.__name__, '\n                           'name=%r)' %\n                           (alias, 'the template %%r (imported on %s) does '\n                           'not export the requested name %s' % (\n                                self.position(node),\n                                repr(name)\n                           ), name))\n            self.outdent()\n            if frame.toplevel:\n                var_names.append(alias)\n                if not alias.startswith('_'):\n                    discarded_names.append(alias)\n            frame.assigned_names.add(alias)\n\n        if var_names:\n            if len(var_names) == 1:\n                name = var_names[0]\n                self.writeline('context.vars[%r] = l_%s' % (name, name))\n            else:\n                self.writeline('context.vars.update({%s})' % ', '.join(\n                    '%r: l_%s' % (name, name) for name in var_names\n                ))\n        if discarded_names:\n            if len(discarded_names) == 1:\n                self.writeline('context.exported_vars.discard(%r)' %\n                               discarded_names[0])\n            else:\n                self.writeline('context.exported_vars.difference_'\n                               'update((%s))' % ', '.join(imap(repr, discarded_names)))\n\n    def visit_For(self, node, frame):\n        # when calculating the nodes for the inner frame we have to exclude\n        # the iterator contents from it\n        children = node.iter_child_nodes(exclude=('iter',))\n        if node.recursive:\n            loop_frame = self.function_scoping(node, frame, children,\n                                               find_special=False)\n        else:\n            loop_frame = frame.inner()\n            loop_frame.inspect(children)\n\n        # try to figure out if we have an extended loop.  An extended loop\n        # is necessary if the loop is in recursive mode if the special loop\n        # variable is accessed in the body.\n        extended_loop = node.recursive or 'loop' in \\\n                        find_undeclared(node.iter_child_nodes(\n                            only=('body',)), ('loop',))\n\n        # if we don't have an recursive loop we have to find the shadowed\n        # variables at that point.  Because loops can be nested but the loop\n        # variable is a special one we have to enforce aliasing for it.\n        if not node.recursive:\n            aliases = self.push_scope(loop_frame, ('loop',))\n\n        # otherwise we set up a buffer and add a function def\n        else:\n            self.writeline('def loop(reciter, loop_render_func, depth=0):', node)\n            self.indent()\n            self.buffer(loop_frame)\n            aliases = {}\n\n        # make sure the loop variable is a special one and raise a template\n        # assertion error if a loop tries to write to loop\n        if extended_loop:\n            self.writeline('l_loop = missing')\n            loop_frame.identifiers.add_special('loop')\n        for name in node.find_all(nodes.Name):\n            if name.ctx == 'store' and name.name == 'loop':\n                self.fail('Can\\'t assign to special loop variable '\n                          'in for-loop target', name.lineno)\n\n        self.pull_locals(loop_frame)\n        if node.else_:\n            iteration_indicator = self.temporary_identifier()\n            self.writeline('%s = 1' % iteration_indicator)\n\n        # Create a fake parent loop if the else or test section of a\n        # loop is accessing the special loop variable and no parent loop\n        # exists.\n        if 'loop' not in aliases and 'loop' in find_undeclared(\n           node.iter_child_nodes(only=('else_', 'test')), ('loop',)):\n            self.writeline(\"l_loop = environment.undefined(%r, name='loop')\" %\n                (\"'loop' is undefined. the filter section of a loop as well \"\n                 \"as the else block don't have access to the special 'loop'\"\n                 \" variable of the current loop.  Because there is no parent \"\n                 \"loop it's undefined.  Happened in loop on %s\" %\n                 self.position(node)))\n\n        self.writeline('for ', node)\n        self.visit(node.target, loop_frame)\n        self.write(extended_loop and ', l_loop in LoopContext(' or ' in ')\n\n        # if we have an extened loop and a node test, we filter in the\n        # \"outer frame\".\n        if extended_loop and node.test is not None:\n            self.write('(')\n            self.visit(node.target, loop_frame)\n            self.write(' for ')\n            self.visit(node.target, loop_frame)\n            self.write(' in ')\n            if node.recursive:\n                self.write('reciter')\n            else:\n                self.visit(node.iter, loop_frame)\n            self.write(' if (')\n            test_frame = loop_frame.copy()\n            self.visit(node.test, test_frame)\n            self.write('))')\n\n        elif node.recursive:\n            self.write('reciter')\n        else:\n            self.visit(node.iter, loop_frame)\n\n        if node.recursive:\n            self.write(', loop_render_func, depth):')\n        else:\n            self.write(extended_loop and '):' or ':')\n\n        # tests in not extended loops become a continue\n        if not extended_loop and node.test is not None:\n            self.indent()\n            self.writeline('if not ')\n            self.visit(node.test, loop_frame)\n            self.write(':')\n            self.indent()\n            self.writeline('continue')\n            self.outdent(2)\n\n        self.indent()\n        self.blockvisit(node.body, loop_frame)\n        if node.else_:\n            self.writeline('%s = 0' % iteration_indicator)\n        self.outdent()\n\n        if node.else_:\n            self.writeline('if %s:' % iteration_indicator)\n            self.indent()\n            self.blockvisit(node.else_, loop_frame)\n            self.outdent()\n\n        # reset the aliases if there are any.\n        if not node.recursive:\n            self.pop_scope(aliases, loop_frame)\n\n        # if the node was recursive we have to return the buffer contents\n        # and start the iteration code\n        if node.recursive:\n            self.return_buffer_contents(loop_frame)\n            self.outdent()\n            self.start_write(frame, node)\n            self.write('loop(')\n            self.visit(node.iter, frame)\n            self.write(', loop)')\n            self.end_write(frame)\n\n    def visit_If(self, node, frame):\n        if_frame = frame.soft()\n        self.writeline('if ', node)\n        self.visit(node.test, if_frame)\n        self.write(':')\n        self.indent()\n        self.blockvisit(node.body, if_frame)\n        self.outdent()\n        if node.else_:\n            self.writeline('else:')\n            self.indent()\n            self.blockvisit(node.else_, if_frame)\n            self.outdent()\n\n    def visit_Macro(self, node, frame):\n        macro_frame = self.macro_body(node, frame)\n        self.newline()\n        if frame.toplevel:\n            if not node.name.startswith('_'):\n                self.write('context.exported_vars.add(%r)' % node.name)\n            self.writeline('context.vars[%r] = ' % node.name)\n        self.write('l_%s = ' % node.name)\n        self.macro_def(node, macro_frame)\n        frame.assigned_names.add(node.name)\n\n    def visit_CallBlock(self, node, frame):\n        children = node.iter_child_nodes(exclude=('call',))\n        call_frame = self.macro_body(node, frame, children)\n        self.writeline('caller = ')\n        self.macro_def(node, call_frame)\n        self.start_write(frame, node)\n        self.visit_Call(node.call, call_frame, forward_caller=True)\n        self.end_write(frame)\n\n    def visit_FilterBlock(self, node, frame):\n        filter_frame = frame.inner()\n        filter_frame.inspect(node.iter_child_nodes())\n        aliases = self.push_scope(filter_frame)\n        self.pull_locals(filter_frame)\n        self.buffer(filter_frame)\n        self.blockvisit(node.body, filter_frame)\n        self.start_write(frame, node)\n        self.visit_Filter(node.filter, filter_frame)\n        self.end_write(frame)\n        self.pop_scope(aliases, filter_frame)\n\n    def visit_ExprStmt(self, node, frame):\n        self.newline(node)\n        self.visit(node.node, frame)\n\n    def visit_Output(self, node, frame):\n        # if we have a known extends statement, we don't output anything\n        # if we are in a require_output_check section\n        if self.has_known_extends and frame.require_output_check:\n            return\n\n        allow_constant_finalize = True\n        if self.environment.finalize:\n            func = self.environment.finalize\n            if getattr(func, 'contextfunction', False) or \\\n               getattr(func, 'evalcontextfunction', False):\n                allow_constant_finalize = False\n            elif getattr(func, 'environmentfunction', False):\n                finalize = lambda x: text_type(\n                    self.environment.finalize(self.environment, x))\n            else:\n                finalize = lambda x: text_type(self.environment.finalize(x))\n        else:\n            finalize = text_type\n\n        # if we are inside a frame that requires output checking, we do so\n        outdent_later = False\n        if frame.require_output_check:\n            self.writeline('if parent_template is None:')\n            self.indent()\n            outdent_later = True\n\n        # try to evaluate as many chunks as possible into a static\n        # string at compile time.\n        body = []\n        for child in node.nodes:\n            try:\n                if not allow_constant_finalize:\n                    raise nodes.Impossible()\n                const = child.as_const(frame.eval_ctx)\n            except nodes.Impossible:\n                body.append(child)\n                continue\n            # the frame can't be volatile here, becaus otherwise the\n            # as_const() function would raise an Impossible exception\n            # at that point.\n            try:\n                if frame.eval_ctx.autoescape:\n                    if hasattr(const, '__html__'):\n                        const = const.__html__()\n                    else:\n                        const = escape(const)\n                const = finalize(const)\n            except Exception:\n                # if something goes wrong here we evaluate the node\n                # at runtime for easier debugging\n                body.append(child)\n                continue\n            if body and isinstance(body[-1], list):\n                body[-1].append(const)\n            else:\n                body.append([const])\n\n        # if we have less than 3 nodes or a buffer we yield or extend/append\n        if len(body) < 3 or frame.buffer is not None:\n            if frame.buffer is not None:\n                # for one item we append, for more we extend\n                if len(body) == 1:\n                    self.writeline('%s.append(' % frame.buffer)\n                else:\n                    self.writeline('%s.extend((' % frame.buffer)\n                self.indent()\n            for item in body:\n                if isinstance(item, list):\n                    val = repr(concat(item))\n                    if frame.buffer is None:\n                        self.writeline('yield ' + val)\n                    else:\n                        self.writeline(val + ', ')\n                else:\n                    if frame.buffer is None:\n                        self.writeline('yield ', item)\n                    else:\n                        self.newline(item)\n                    close = 1\n                    if frame.eval_ctx.volatile:\n                        self.write('(context.eval_ctx.autoescape and'\n                                   ' escape or to_string)(')\n                    elif frame.eval_ctx.autoescape:\n                        self.write('escape(')\n                    else:\n                        self.write('to_string(')\n                    if self.environment.finalize is not None:\n                        self.write('environment.finalize(')\n                        if getattr(self.environment.finalize,\n                                   \"contextfunction\", False):\n                            self.write('context, ')\n                        close += 1\n                    self.visit(item, frame)\n                    self.write(')' * close)\n                    if frame.buffer is not None:\n                        self.write(', ')\n            if frame.buffer is not None:\n                # close the open parentheses\n                self.outdent()\n                self.writeline(len(body) == 1 and ')' or '))')\n\n        # otherwise we create a format string as this is faster in that case\n        else:\n            format = []\n            arguments = []\n            for item in body:\n                if isinstance(item, list):\n                    format.append(concat(item).replace('%', '%%'))\n                else:\n                    format.append('%s')\n                    arguments.append(item)\n            self.writeline('yield ')\n            self.write(repr(concat(format)) + ' % (')\n            self.indent()\n            for argument in arguments:\n                self.newline(argument)\n                close = 0\n                if frame.eval_ctx.volatile:\n                    self.write('(context.eval_ctx.autoescape and'\n                               ' escape or to_string)(')\n                    close += 1\n                elif frame.eval_ctx.autoescape:\n                    self.write('escape(')\n                    close += 1\n                if self.environment.finalize is not None:\n                    self.write('environment.finalize(')\n                    if getattr(self.environment.finalize,\n                               'contextfunction', False):\n                        self.write('context, ')\n                    elif getattr(self.environment.finalize,\n                               'evalcontextfunction', False):\n                        self.write('context.eval_ctx, ')\n                    elif getattr(self.environment.finalize,\n                               'environmentfunction', False):\n                        self.write('environment, ')\n                    close += 1\n                self.visit(argument, frame)\n                self.write(')' * close + ', ')\n            self.outdent()\n            self.writeline(')')\n\n        if outdent_later:\n            self.outdent()\n\n    def make_assignment_frame(self, frame):\n        # toplevel assignments however go into the local namespace and\n        # the current template's context.  We create a copy of the frame\n        # here and add a set so that the Name visitor can add the assigned\n        # names here.\n        if not frame.toplevel:\n            return frame\n        assignment_frame = frame.copy()\n        assignment_frame.toplevel_assignments = set()\n        return assignment_frame\n\n    def export_assigned_vars(self, frame, assignment_frame):\n        if not frame.toplevel:\n            return\n        public_names = [x for x in assignment_frame.toplevel_assignments\n                        if not x.startswith('_')]\n        if len(assignment_frame.toplevel_assignments) == 1:\n            name = next(iter(assignment_frame.toplevel_assignments))\n            self.writeline('context.vars[%r] = l_%s' % (name, name))\n        else:\n            self.writeline('context.vars.update({')\n            for idx, name in enumerate(assignment_frame.toplevel_assignments):\n                if idx:\n                    self.write(', ')\n                self.write('%r: l_%s' % (name, name))\n            self.write('})')\n        if public_names:\n            if len(public_names) == 1:\n                self.writeline('context.exported_vars.add(%r)' %\n                               public_names[0])\n            else:\n                self.writeline('context.exported_vars.update((%s))' %\n                               ', '.join(imap(repr, public_names)))\n\n    def visit_Assign(self, node, frame):\n        self.newline(node)\n        assignment_frame = self.make_assignment_frame(frame)\n        self.visit(node.target, assignment_frame)\n        self.write(' = ')\n        self.visit(node.node, frame)\n        self.export_assigned_vars(frame, assignment_frame)\n\n    def visit_AssignBlock(self, node, frame):\n        block_frame = frame.inner()\n        block_frame.inspect(node.body)\n        aliases = self.push_scope(block_frame)\n        self.pull_locals(block_frame)\n        self.buffer(block_frame)\n        self.blockvisit(node.body, block_frame)\n        self.pop_scope(aliases, block_frame)\n\n        assignment_frame = self.make_assignment_frame(frame)\n        self.newline(node)\n        self.visit(node.target, assignment_frame)\n        self.write(' = concat(%s)' % block_frame.buffer)\n        self.export_assigned_vars(frame, assignment_frame)\n\n    # -- Expression Visitors\n\n    def visit_Name(self, node, frame):\n        if node.ctx == 'store' and frame.toplevel:\n            frame.toplevel_assignments.add(node.name)\n        self.write('l_' + node.name)\n        frame.assigned_names.add(node.name)\n\n    def visit_Const(self, node, frame):\n        val = node.value\n        if isinstance(val, float):\n            self.write(str(val))\n        else:\n            self.write(repr(val))\n\n    def visit_TemplateData(self, node, frame):\n        try:\n            self.write(repr(node.as_const(frame.eval_ctx)))\n        except nodes.Impossible:\n            self.write('(context.eval_ctx.autoescape and Markup or identity)(%r)'\n                       % node.data)\n\n    def visit_Tuple(self, node, frame):\n        self.write('(')\n        idx = -1\n        for idx, item in enumerate(node.items):\n            if idx:\n                self.write(', ')\n            self.visit(item, frame)\n        self.write(idx == 0 and ',)' or ')')\n\n    def visit_List(self, node, frame):\n        self.write('[')\n        for idx, item in enumerate(node.items):\n            if idx:\n                self.write(', ')\n            self.visit(item, frame)\n        self.write(']')\n\n    def visit_Dict(self, node, frame):\n        self.write('{')\n        for idx, item in enumerate(node.items):\n            if idx:\n                self.write(', ')\n            self.visit(item.key, frame)\n            self.write(': ')\n            self.visit(item.value, frame)\n        self.write('}')\n\n    def binop(operator, interceptable=True):\n        def visitor(self, node, frame):\n            if self.environment.sandboxed and \\\n               operator in self.environment.intercepted_binops:\n                self.write('environment.call_binop(context, %r, ' % operator)\n                self.visit(node.left, frame)\n                self.write(', ')\n                self.visit(node.right, frame)\n            else:\n                self.write('(')\n                self.visit(node.left, frame)\n                self.write(' %s ' % operator)\n                self.visit(node.right, frame)\n            self.write(')')\n        return visitor\n\n    def uaop(operator, interceptable=True):\n        def visitor(self, node, frame):\n            if self.environment.sandboxed and \\\n               operator in self.environment.intercepted_unops:\n                self.write('environment.call_unop(context, %r, ' % operator)\n                self.visit(node.node, frame)\n            else:\n                self.write('(' + operator)\n                self.visit(node.node, frame)\n            self.write(')')\n        return visitor\n\n    visit_Add = binop('+')\n    visit_Sub = binop('-')\n    visit_Mul = binop('*')\n    visit_Div = binop('/')\n    visit_FloorDiv = binop('//')\n    visit_Pow = binop('**')\n    visit_Mod = binop('%')\n    visit_And = binop('and', interceptable=False)\n    visit_Or = binop('or', interceptable=False)\n    visit_Pos = uaop('+')\n    visit_Neg = uaop('-')\n    visit_Not = uaop('not ', interceptable=False)\n    del binop, uaop\n\n    def visit_Concat(self, node, frame):\n        if frame.eval_ctx.volatile:\n            func_name = '(context.eval_ctx.volatile and' \\\n                        ' markup_join or unicode_join)'\n        elif frame.eval_ctx.autoescape:\n            func_name = 'markup_join'\n        else:\n            func_name = 'unicode_join'\n        self.write('%s((' % func_name)\n        for arg in node.nodes:\n            self.visit(arg, frame)\n            self.write(', ')\n        self.write('))')\n\n    def visit_Compare(self, node, frame):\n        self.visit(node.expr, frame)\n        for op in node.ops:\n            self.visit(op, frame)\n\n    def visit_Operand(self, node, frame):\n        self.write(' %s ' % operators[node.op])\n        self.visit(node.expr, frame)\n\n    def visit_Getattr(self, node, frame):\n        self.write('environment.getattr(')\n        self.visit(node.node, frame)\n        self.write(', %r)' % node.attr)\n\n    def visit_Getitem(self, node, frame):\n        # slices bypass the environment getitem method.\n        if isinstance(node.arg, nodes.Slice):\n            self.visit(node.node, frame)\n            self.write('[')\n            self.visit(node.arg, frame)\n            self.write(']')\n        else:\n            self.write('environment.getitem(')\n            self.visit(node.node, frame)\n            self.write(', ')\n            self.visit(node.arg, frame)\n            self.write(')')\n\n    def visit_Slice(self, node, frame):\n        if node.start is not None:\n            self.visit(node.start, frame)\n        self.write(':')\n        if node.stop is not None:\n            self.visit(node.stop, frame)\n        if node.step is not None:\n            self.write(':')\n            self.visit(node.step, frame)\n\n    def visit_Filter(self, node, frame):\n        self.write(self.filters[node.name] + '(')\n        func = self.environment.filters.get(node.name)\n        if func is None:\n            self.fail('no filter named %r' % node.name, node.lineno)\n        if getattr(func, 'contextfilter', False):\n            self.write('context, ')\n        elif getattr(func, 'evalcontextfilter', False):\n            self.write('context.eval_ctx, ')\n        elif getattr(func, 'environmentfilter', False):\n            self.write('environment, ')\n\n        # if the filter node is None we are inside a filter block\n        # and want to write to the current buffer\n        if node.node is not None:\n            self.visit(node.node, frame)\n        elif frame.eval_ctx.volatile:\n            self.write('(context.eval_ctx.autoescape and'\n                       ' Markup(concat(%s)) or concat(%s))' %\n                       (frame.buffer, frame.buffer))\n        elif frame.eval_ctx.autoescape:\n            self.write('Markup(concat(%s))' % frame.buffer)\n        else:\n            self.write('concat(%s)' % frame.buffer)\n        self.signature(node, frame)\n        self.write(')')\n\n    def visit_Test(self, node, frame):\n        self.write(self.tests[node.name] + '(')\n        if node.name not in self.environment.tests:\n            self.fail('no test named %r' % node.name, node.lineno)\n        self.visit(node.node, frame)\n        self.signature(node, frame)\n        self.write(')')\n\n    def visit_CondExpr(self, node, frame):\n        def write_expr2():\n            if node.expr2 is not None:\n                return self.visit(node.expr2, frame)\n            self.write('environment.undefined(%r)' % ('the inline if-'\n                       'expression on %s evaluated to false and '\n                       'no else section was defined.' % self.position(node)))\n\n        self.write('(')\n        self.visit(node.expr1, frame)\n        self.write(' if ')\n        self.visit(node.test, frame)\n        self.write(' else ')\n        write_expr2()\n        self.write(')')\n\n    def visit_Call(self, node, frame, forward_caller=False):\n        if self.environment.sandboxed:\n            self.write('environment.call(context, ')\n        else:\n            self.write('context.call(')\n        self.visit(node.node, frame)\n        extra_kwargs = forward_caller and {'caller': 'caller'} or None\n        self.signature(node, frame, extra_kwargs)\n        self.write(')')\n\n    def visit_Keyword(self, node, frame):\n        self.write(node.key + '=')\n        self.visit(node.value, frame)\n\n    # -- Unused nodes for extensions\n\n    def visit_MarkSafe(self, node, frame):\n        self.write('Markup(')\n        self.visit(node.expr, frame)\n        self.write(')')\n\n    def visit_MarkSafeIfAutoescape(self, node, frame):\n        self.write('(context.eval_ctx.autoescape and Markup or identity)(')\n        self.visit(node.expr, frame)\n        self.write(')')\n\n    def visit_EnvironmentAttribute(self, node, frame):\n        self.write('environment.' + node.name)\n\n    def visit_ExtensionAttribute(self, node, frame):\n        self.write('environment.extensions[%r].%s' % (node.identifier, node.name))\n\n    def visit_ImportedName(self, node, frame):\n        self.write(self.import_aliases[node.importname])\n\n    def visit_InternalName(self, node, frame):\n        self.write(node.name)\n\n    def visit_ContextReference(self, node, frame):\n        self.write('context')\n\n    def visit_Continue(self, node, frame):\n        self.writeline('continue', node)\n\n    def visit_Break(self, node, frame):\n        self.writeline('break', node)\n\n    def visit_Scope(self, node, frame):\n        scope_frame = frame.inner()\n        scope_frame.inspect(node.iter_child_nodes())\n        aliases = self.push_scope(scope_frame)\n        self.pull_locals(scope_frame)\n        self.blockvisit(node.body, scope_frame)\n        self.pop_scope(aliases, scope_frame)\n\n    def visit_EvalContextModifier(self, node, frame):\n        for keyword in node.options:\n            self.writeline('context.eval_ctx.%s = ' % keyword.key)\n            self.visit(keyword.value, frame)\n            try:\n                val = keyword.value.as_const(frame.eval_ctx)\n            except nodes.Impossible:\n                frame.eval_ctx.volatile = True\n            else:\n                setattr(frame.eval_ctx, keyword.key, val)\n\n    def visit_ScopedEvalContextModifier(self, node, frame):\n        old_ctx_name = self.temporary_identifier()\n        safed_ctx = frame.eval_ctx.save()\n        self.writeline('%s = context.eval_ctx.save()' % old_ctx_name)\n        self.visit_EvalContextModifier(node, frame)\n        for child in node.body:\n            self.visit(child, frame)\n        frame.eval_ctx.revert(safed_ctx)\n        self.writeline('context.eval_ctx.revert(%s)' % old_ctx_name)\n"
  },
  {
    "path": "lib/jinja2/constants.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    jinja.constants\n    ~~~~~~~~~~~~~~~\n\n    Various constants.\n\n    :copyright: (c) 2010 by the Jinja Team.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\n\n\n#: list of lorem ipsum words used by the lipsum() helper function\nLOREM_IPSUM_WORDS = u'''\\\na ac accumsan ad adipiscing aenean aliquam aliquet amet ante aptent arcu at\nauctor augue bibendum blandit class commodo condimentum congue consectetuer\nconsequat conubia convallis cras cubilia cum curabitur curae cursus dapibus\ndiam dictum dictumst dignissim dis dolor donec dui duis egestas eget eleifend\nelementum elit enim erat eros est et etiam eu euismod facilisi facilisis fames\nfaucibus felis fermentum feugiat fringilla fusce gravida habitant habitasse hac\nhendrerit hymenaeos iaculis id imperdiet in inceptos integer interdum ipsum\njusto lacinia lacus laoreet lectus leo libero ligula litora lobortis lorem\nluctus maecenas magna magnis malesuada massa mattis mauris metus mi molestie\nmollis montes morbi mus nam nascetur natoque nec neque netus nibh nisi nisl non\nnonummy nostra nulla nullam nunc odio orci ornare parturient pede pellentesque\npenatibus per pharetra phasellus placerat platea porta porttitor posuere\npotenti praesent pretium primis proin pulvinar purus quam quis quisque rhoncus\nridiculus risus rutrum sagittis sapien scelerisque sed sem semper senectus sit\nsociis sociosqu sodales sollicitudin suscipit suspendisse taciti tellus tempor\ntempus tincidunt torquent tortor tristique turpis ullamcorper ultrices\nultricies urna ut varius vehicula vel velit venenatis vestibulum vitae vivamus\nviverra volutpat vulputate'''\n"
  },
  {
    "path": "lib/jinja2/debug.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    jinja2.debug\n    ~~~~~~~~~~~~\n\n    Implements the debug interface for Jinja.  This module does some pretty\n    ugly stuff with the Python traceback system in order to achieve tracebacks\n    with correct line numbers, locals and contents.\n\n    :copyright: (c) 2010 by the Jinja Team.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nimport sys\nimport traceback\nfrom types import TracebackType, CodeType\nfrom jinja2.utils import missing, internal_code\nfrom jinja2.exceptions import TemplateSyntaxError\nfrom jinja2._compat import iteritems, reraise, PY2\n\n# on pypy we can take advantage of transparent proxies\ntry:\n    from __pypy__ import tproxy\nexcept ImportError:\n    tproxy = None\n\n\n# how does the raise helper look like?\ntry:\n    exec(\"raise TypeError, 'foo'\")\nexcept SyntaxError:\n    raise_helper = 'raise __jinja_exception__[1]'\nexcept TypeError:\n    raise_helper = 'raise __jinja_exception__[0], __jinja_exception__[1]'\n\n\nclass TracebackFrameProxy(object):\n    \"\"\"Proxies a traceback frame.\"\"\"\n\n    def __init__(self, tb):\n        self.tb = tb\n        self._tb_next = None\n\n    @property\n    def tb_next(self):\n        return self._tb_next\n\n    def set_next(self, next):\n        if tb_set_next is not None:\n            try:\n                tb_set_next(self.tb, next and next.tb or None)\n            except Exception:\n                # this function can fail due to all the hackery it does\n                # on various python implementations.  We just catch errors\n                # down and ignore them if necessary.\n                pass\n        self._tb_next = next\n\n    @property\n    def is_jinja_frame(self):\n        return '__jinja_template__' in self.tb.tb_frame.f_globals\n\n    def __getattr__(self, name):\n        return getattr(self.tb, name)\n\n\ndef make_frame_proxy(frame):\n    proxy = TracebackFrameProxy(frame)\n    if tproxy is None:\n        return proxy\n    def operation_handler(operation, *args, **kwargs):\n        if operation in ('__getattribute__', '__getattr__'):\n            return getattr(proxy, args[0])\n        elif operation == '__setattr__':\n            proxy.__setattr__(*args, **kwargs)\n        else:\n            return getattr(proxy, operation)(*args, **kwargs)\n    return tproxy(TracebackType, operation_handler)\n\n\nclass ProcessedTraceback(object):\n    \"\"\"Holds a Jinja preprocessed traceback for printing or reraising.\"\"\"\n\n    def __init__(self, exc_type, exc_value, frames):\n        assert frames, 'no frames for this traceback?'\n        self.exc_type = exc_type\n        self.exc_value = exc_value\n        self.frames = frames\n\n        # newly concatenate the frames (which are proxies)\n        prev_tb = None\n        for tb in self.frames:\n            if prev_tb is not None:\n                prev_tb.set_next(tb)\n            prev_tb = tb\n        prev_tb.set_next(None)\n\n    def render_as_text(self, limit=None):\n        \"\"\"Return a string with the traceback.\"\"\"\n        lines = traceback.format_exception(self.exc_type, self.exc_value,\n                                           self.frames[0], limit=limit)\n        return ''.join(lines).rstrip()\n\n    def render_as_html(self, full=False):\n        \"\"\"Return a unicode string with the traceback as rendered HTML.\"\"\"\n        from jinja2.debugrenderer import render_traceback\n        return u'%s\\n\\n<!--\\n%s\\n-->' % (\n            render_traceback(self, full=full),\n            self.render_as_text().decode('utf-8', 'replace')\n        )\n\n    @property\n    def is_template_syntax_error(self):\n        \"\"\"`True` if this is a template syntax error.\"\"\"\n        return isinstance(self.exc_value, TemplateSyntaxError)\n\n    @property\n    def exc_info(self):\n        \"\"\"Exception info tuple with a proxy around the frame objects.\"\"\"\n        return self.exc_type, self.exc_value, self.frames[0]\n\n    @property\n    def standard_exc_info(self):\n        \"\"\"Standard python exc_info for re-raising\"\"\"\n        tb = self.frames[0]\n        # the frame will be an actual traceback (or transparent proxy) if\n        # we are on pypy or a python implementation with support for tproxy\n        if type(tb) is not TracebackType:\n            tb = tb.tb\n        return self.exc_type, self.exc_value, tb\n\n\ndef make_traceback(exc_info, source_hint=None):\n    \"\"\"Creates a processed traceback object from the exc_info.\"\"\"\n    exc_type, exc_value, tb = exc_info\n    if isinstance(exc_value, TemplateSyntaxError):\n        exc_info = translate_syntax_error(exc_value, source_hint)\n        initial_skip = 0\n    else:\n        initial_skip = 1\n    return translate_exception(exc_info, initial_skip)\n\n\ndef translate_syntax_error(error, source=None):\n    \"\"\"Rewrites a syntax error to please traceback systems.\"\"\"\n    error.source = source\n    error.translated = True\n    exc_info = (error.__class__, error, None)\n    filename = error.filename\n    if filename is None:\n        filename = '<unknown>'\n    return fake_exc_info(exc_info, filename, error.lineno)\n\n\ndef translate_exception(exc_info, initial_skip=0):\n    \"\"\"If passed an exc_info it will automatically rewrite the exceptions\n    all the way down to the correct line numbers and frames.\n    \"\"\"\n    tb = exc_info[2]\n    frames = []\n\n    # skip some internal frames if wanted\n    for x in range(initial_skip):\n        if tb is not None:\n            tb = tb.tb_next\n    initial_tb = tb\n\n    while tb is not None:\n        # skip frames decorated with @internalcode.  These are internal\n        # calls we can't avoid and that are useless in template debugging\n        # output.\n        if tb.tb_frame.f_code in internal_code:\n            tb = tb.tb_next\n            continue\n\n        # save a reference to the next frame if we override the current\n        # one with a faked one.\n        next = tb.tb_next\n\n        # fake template exceptions\n        template = tb.tb_frame.f_globals.get('__jinja_template__')\n        if template is not None:\n            lineno = template.get_corresponding_lineno(tb.tb_lineno)\n            tb = fake_exc_info(exc_info[:2] + (tb,), template.filename,\n                               lineno)[2]\n\n        frames.append(make_frame_proxy(tb))\n        tb = next\n\n    # if we don't have any exceptions in the frames left, we have to\n    # reraise it unchanged.\n    # XXX: can we backup here?  when could this happen?\n    if not frames:\n        reraise(exc_info[0], exc_info[1], exc_info[2])\n\n    return ProcessedTraceback(exc_info[0], exc_info[1], frames)\n\n\ndef fake_exc_info(exc_info, filename, lineno):\n    \"\"\"Helper for `translate_exception`.\"\"\"\n    exc_type, exc_value, tb = exc_info\n\n    # figure the real context out\n    if tb is not None:\n        real_locals = tb.tb_frame.f_locals.copy()\n        ctx = real_locals.get('context')\n        if ctx:\n            locals = ctx.get_all()\n        else:\n            locals = {}\n        for name, value in iteritems(real_locals):\n            if name.startswith('l_') and value is not missing:\n                locals[name[2:]] = value\n\n        # if there is a local called __jinja_exception__, we get\n        # rid of it to not break the debug functionality.\n        locals.pop('__jinja_exception__', None)\n    else:\n        locals = {}\n\n    # assamble fake globals we need\n    globals = {\n        '__name__':             filename,\n        '__file__':             filename,\n        '__jinja_exception__':  exc_info[:2],\n\n        # we don't want to keep the reference to the template around\n        # to not cause circular dependencies, but we mark it as Jinja\n        # frame for the ProcessedTraceback\n        '__jinja_template__':   None\n    }\n\n    # and fake the exception\n    code = compile('\\n' * (lineno - 1) + raise_helper, filename, 'exec')\n\n    # if it's possible, change the name of the code.  This won't work\n    # on some python environments such as google appengine\n    try:\n        if tb is None:\n            location = 'template'\n        else:\n            function = tb.tb_frame.f_code.co_name\n            if function == 'root':\n                location = 'top-level template code'\n            elif function.startswith('block_'):\n                location = 'block \"%s\"' % function[6:]\n            else:\n                location = 'template'\n\n        if PY2:\n            code = CodeType(0, code.co_nlocals, code.co_stacksize,\n                            code.co_flags, code.co_code, code.co_consts,\n                            code.co_names, code.co_varnames, filename,\n                            location, code.co_firstlineno,\n                            code.co_lnotab, (), ())\n        else:\n            code = CodeType(0, code.co_kwonlyargcount,\n                            code.co_nlocals, code.co_stacksize,\n                            code.co_flags, code.co_code, code.co_consts,\n                            code.co_names, code.co_varnames, filename,\n                            location, code.co_firstlineno,\n                            code.co_lnotab, (), ())\n    except Exception as e:\n        pass\n\n    # execute the code and catch the new traceback\n    try:\n        exec(code, globals, locals)\n    except:\n        exc_info = sys.exc_info()\n        new_tb = exc_info[2].tb_next\n\n    # return without this frame\n    return exc_info[:2] + (new_tb,)\n\n\ndef _init_ugly_crap():\n    \"\"\"This function implements a few ugly things so that we can patch the\n    traceback objects.  The function returned allows resetting `tb_next` on\n    any python traceback object.  Do not attempt to use this on non cpython\n    interpreters\n    \"\"\"\n    import ctypes\n    from types import TracebackType\n\n    if PY2:\n        # figure out size of _Py_ssize_t for Python 2:\n        if hasattr(ctypes.pythonapi, 'Py_InitModule4_64'):\n            _Py_ssize_t = ctypes.c_int64\n        else:\n            _Py_ssize_t = ctypes.c_int\n    else:\n        # platform ssize_t on Python 3\n        _Py_ssize_t = ctypes.c_ssize_t\n\n    # regular python\n    class _PyObject(ctypes.Structure):\n        pass\n    _PyObject._fields_ = [\n        ('ob_refcnt', _Py_ssize_t),\n        ('ob_type', ctypes.POINTER(_PyObject))\n    ]\n\n    # python with trace\n    if hasattr(sys, 'getobjects'):\n        class _PyObject(ctypes.Structure):\n            pass\n        _PyObject._fields_ = [\n            ('_ob_next', ctypes.POINTER(_PyObject)),\n            ('_ob_prev', ctypes.POINTER(_PyObject)),\n            ('ob_refcnt', _Py_ssize_t),\n            ('ob_type', ctypes.POINTER(_PyObject))\n        ]\n\n    class _Traceback(_PyObject):\n        pass\n    _Traceback._fields_ = [\n        ('tb_next', ctypes.POINTER(_Traceback)),\n        ('tb_frame', ctypes.POINTER(_PyObject)),\n        ('tb_lasti', ctypes.c_int),\n        ('tb_lineno', ctypes.c_int)\n    ]\n\n    def tb_set_next(tb, next):\n        \"\"\"Set the tb_next attribute of a traceback object.\"\"\"\n        if not (isinstance(tb, TracebackType) and\n                (next is None or isinstance(next, TracebackType))):\n            raise TypeError('tb_set_next arguments must be traceback objects')\n        obj = _Traceback.from_address(id(tb))\n        if tb.tb_next is not None:\n            old = _Traceback.from_address(id(tb.tb_next))\n            old.ob_refcnt -= 1\n        if next is None:\n            obj.tb_next = ctypes.POINTER(_Traceback)()\n        else:\n            next = _Traceback.from_address(id(next))\n            next.ob_refcnt += 1\n            obj.tb_next = ctypes.pointer(next)\n\n    return tb_set_next\n\n\n# try to get a tb_set_next implementation if we don't have transparent\n# proxies.\ntb_set_next = None\nif tproxy is None:\n    try:\n        tb_set_next = _init_ugly_crap()\n    except:\n        pass\n    del _init_ugly_crap\n"
  },
  {
    "path": "lib/jinja2/defaults.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    jinja2.defaults\n    ~~~~~~~~~~~~~~~\n\n    Jinja default filters and tags.\n\n    :copyright: (c) 2010 by the Jinja Team.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nfrom jinja2._compat import range_type\nfrom jinja2.utils import generate_lorem_ipsum, Cycler, Joiner\n\n\n# defaults for the parser / lexer\nBLOCK_START_STRING = '{%'\nBLOCK_END_STRING = '%}'\nVARIABLE_START_STRING = '{{'\nVARIABLE_END_STRING = '}}'\nCOMMENT_START_STRING = '{#'\nCOMMENT_END_STRING = '#}'\nLINE_STATEMENT_PREFIX = None\nLINE_COMMENT_PREFIX = None\nTRIM_BLOCKS = False\nLSTRIP_BLOCKS = False\nNEWLINE_SEQUENCE = '\\n'\nKEEP_TRAILING_NEWLINE = False\n\n\n# default filters, tests and namespace\nfrom jinja2.filters import FILTERS as DEFAULT_FILTERS\nfrom jinja2.tests import TESTS as DEFAULT_TESTS\nDEFAULT_NAMESPACE = {\n    'range':        range_type,\n    'dict':         dict,\n    'lipsum':       generate_lorem_ipsum,\n    'cycler':       Cycler,\n    'joiner':       Joiner\n}\n\n\n# export all constants\n__all__ = tuple(x for x in locals().keys() if x.isupper())\n"
  },
  {
    "path": "lib/jinja2/environment.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    jinja2.environment\n    ~~~~~~~~~~~~~~~~~~\n\n    Provides a class that holds runtime and parsing time options.\n\n    :copyright: (c) 2010 by the Jinja Team.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nimport os\nimport sys\nfrom jinja2 import nodes\nfrom jinja2.defaults import BLOCK_START_STRING, \\\n     BLOCK_END_STRING, VARIABLE_START_STRING, VARIABLE_END_STRING, \\\n     COMMENT_START_STRING, COMMENT_END_STRING, LINE_STATEMENT_PREFIX, \\\n     LINE_COMMENT_PREFIX, TRIM_BLOCKS, NEWLINE_SEQUENCE, \\\n     DEFAULT_FILTERS, DEFAULT_TESTS, DEFAULT_NAMESPACE, \\\n     KEEP_TRAILING_NEWLINE, LSTRIP_BLOCKS\nfrom jinja2.lexer import get_lexer, TokenStream\nfrom jinja2.parser import Parser\nfrom jinja2.nodes import EvalContext\nfrom jinja2.optimizer import optimize\nfrom jinja2.compiler import generate, CodeGenerator\nfrom jinja2.runtime import Undefined, new_context, Context\nfrom jinja2.exceptions import TemplateSyntaxError, TemplateNotFound, \\\n     TemplatesNotFound, TemplateRuntimeError\nfrom jinja2.utils import import_string, LRUCache, Markup, missing, \\\n     concat, consume, internalcode\nfrom jinja2._compat import imap, ifilter, string_types, iteritems, \\\n     text_type, reraise, implements_iterator, implements_to_string, \\\n     get_next, encode_filename, PY2, PYPY\nfrom functools import reduce\n\n\n# for direct template usage we have up to ten living environments\n_spontaneous_environments = LRUCache(10)\n\n# the function to create jinja traceback objects.  This is dynamically\n# imported on the first exception in the exception handler.\n_make_traceback = None\n\n\ndef get_spontaneous_environment(*args):\n    \"\"\"Return a new spontaneous environment.  A spontaneous environment is an\n    unnamed and unaccessible (in theory) environment that is used for\n    templates generated from a string and not from the file system.\n    \"\"\"\n    try:\n        env = _spontaneous_environments.get(args)\n    except TypeError:\n        return Environment(*args)\n    if env is not None:\n        return env\n    _spontaneous_environments[args] = env = Environment(*args)\n    env.shared = True\n    return env\n\n\ndef create_cache(size):\n    \"\"\"Return the cache class for the given size.\"\"\"\n    if size == 0:\n        return None\n    if size < 0:\n        return {}\n    return LRUCache(size)\n\n\ndef copy_cache(cache):\n    \"\"\"Create an empty copy of the given cache.\"\"\"\n    if cache is None:\n        return None\n    elif type(cache) is dict:\n        return {}\n    return LRUCache(cache.capacity)\n\n\ndef load_extensions(environment, extensions):\n    \"\"\"Load the extensions from the list and bind it to the environment.\n    Returns a dict of instantiated environments.\n    \"\"\"\n    result = {}\n    for extension in extensions:\n        if isinstance(extension, string_types):\n            extension = import_string(extension)\n        result[extension.identifier] = extension(environment)\n    return result\n\n\ndef _environment_sanity_check(environment):\n    \"\"\"Perform a sanity check on the environment.\"\"\"\n    assert issubclass(environment.undefined, Undefined), 'undefined must ' \\\n        'be a subclass of undefined because filters depend on it.'\n    assert environment.block_start_string != \\\n        environment.variable_start_string != \\\n        environment.comment_start_string, 'block, variable and comment ' \\\n        'start strings must be different'\n    assert environment.newline_sequence in ('\\r', '\\r\\n', '\\n'), \\\n        'newline_sequence set to unknown line ending string.'\n    return environment\n\n\nclass Environment(object):\n    r\"\"\"The core component of Jinja is the `Environment`.  It contains\n    important shared variables like configuration, filters, tests,\n    globals and others.  Instances of this class may be modified if\n    they are not shared and if no template was loaded so far.\n    Modifications on environments after the first template was loaded\n    will lead to surprising effects and undefined behavior.\n\n    Here are the possible initialization parameters:\n\n        `block_start_string`\n            The string marking the beginning of a block.  Defaults to ``'{%'``.\n\n        `block_end_string`\n            The string marking the end of a block.  Defaults to ``'%}'``.\n\n        `variable_start_string`\n            The string marking the beginning of a print statement.\n            Defaults to ``'{{'``.\n\n        `variable_end_string`\n            The string marking the end of a print statement.  Defaults to\n            ``'}}'``.\n\n        `comment_start_string`\n            The string marking the beginning of a comment.  Defaults to ``'{#'``.\n\n        `comment_end_string`\n            The string marking the end of a comment.  Defaults to ``'#}'``.\n\n        `line_statement_prefix`\n            If given and a string, this will be used as prefix for line based\n            statements.  See also :ref:`line-statements`.\n\n        `line_comment_prefix`\n            If given and a string, this will be used as prefix for line based\n            comments.  See also :ref:`line-statements`.\n\n            .. versionadded:: 2.2\n\n        `trim_blocks`\n            If this is set to ``True`` the first newline after a block is\n            removed (block, not variable tag!).  Defaults to `False`.\n\n        `lstrip_blocks`\n            If this is set to ``True`` leading spaces and tabs are stripped\n            from the start of a line to a block.  Defaults to `False`.\n\n        `newline_sequence`\n            The sequence that starts a newline.  Must be one of ``'\\r'``,\n            ``'\\n'`` or ``'\\r\\n'``.  The default is ``'\\n'`` which is a\n            useful default for Linux and OS X systems as well as web\n            applications.\n\n        `keep_trailing_newline`\n            Preserve the trailing newline when rendering templates.\n            The default is ``False``, which causes a single newline,\n            if present, to be stripped from the end of the template.\n\n            .. versionadded:: 2.7\n\n        `extensions`\n            List of Jinja extensions to use.  This can either be import paths\n            as strings or extension classes.  For more information have a\n            look at :ref:`the extensions documentation <jinja-extensions>`.\n\n        `optimized`\n            should the optimizer be enabled?  Default is `True`.\n\n        `undefined`\n            :class:`Undefined` or a subclass of it that is used to represent\n            undefined values in the template.\n\n        `finalize`\n            A callable that can be used to process the result of a variable\n            expression before it is output.  For example one can convert\n            `None` implicitly into an empty string here.\n\n        `autoescape`\n            If set to true the XML/HTML autoescaping feature is enabled by\n            default.  For more details about autoescaping see\n            :class:`~jinja2.utils.Markup`.  As of Jinja 2.4 this can also\n            be a callable that is passed the template name and has to\n            return `True` or `False` depending on autoescape should be\n            enabled by default.\n\n            .. versionchanged:: 2.4\n               `autoescape` can now be a function\n\n        `loader`\n            The template loader for this environment.\n\n        `cache_size`\n            The size of the cache.  Per default this is ``400`` which means\n            that if more than 400 templates are loaded the loader will clean\n            out the least recently used template.  If the cache size is set to\n            ``0`` templates are recompiled all the time, if the cache size is\n            ``-1`` the cache will not be cleaned.\n\n            .. versionchanged:: 2.8\n               The cache size was increased to 400 from a low 50.\n\n        `auto_reload`\n            Some loaders load templates from locations where the template\n            sources may change (ie: file system or database).  If\n            `auto_reload` is set to `True` (default) every time a template is\n            requested the loader checks if the source changed and if yes, it\n            will reload the template.  For higher performance it's possible to\n            disable that.\n\n        `bytecode_cache`\n            If set to a bytecode cache object, this object will provide a\n            cache for the internal Jinja bytecode so that templates don't\n            have to be parsed if they were not changed.\n\n            See :ref:`bytecode-cache` for more information.\n    \"\"\"\n\n    #: if this environment is sandboxed.  Modifying this variable won't make\n    #: the environment sandboxed though.  For a real sandboxed environment\n    #: have a look at jinja2.sandbox.  This flag alone controls the code\n    #: generation by the compiler.\n    sandboxed = False\n\n    #: True if the environment is just an overlay\n    overlayed = False\n\n    #: the environment this environment is linked to if it is an overlay\n    linked_to = None\n\n    #: shared environments have this set to `True`.  A shared environment\n    #: must not be modified\n    shared = False\n\n    #: these are currently EXPERIMENTAL undocumented features.\n    exception_handler = None\n    exception_formatter = None\n\n    #: the class that is used for code generation.  See\n    #: :class:`~jinja2.compiler.CodeGenerator` for more information.\n    code_generator_class = CodeGenerator\n\n    #: the context class thatis used for templates.  See\n    #: :class:`~jinja2.runtime.Context` for more information.\n    context_class = Context\n\n    def __init__(self,\n                 block_start_string=BLOCK_START_STRING,\n                 block_end_string=BLOCK_END_STRING,\n                 variable_start_string=VARIABLE_START_STRING,\n                 variable_end_string=VARIABLE_END_STRING,\n                 comment_start_string=COMMENT_START_STRING,\n                 comment_end_string=COMMENT_END_STRING,\n                 line_statement_prefix=LINE_STATEMENT_PREFIX,\n                 line_comment_prefix=LINE_COMMENT_PREFIX,\n                 trim_blocks=TRIM_BLOCKS,\n                 lstrip_blocks=LSTRIP_BLOCKS,\n                 newline_sequence=NEWLINE_SEQUENCE,\n                 keep_trailing_newline=KEEP_TRAILING_NEWLINE,\n                 extensions=(),\n                 optimized=True,\n                 undefined=Undefined,\n                 finalize=None,\n                 autoescape=False,\n                 loader=None,\n                 cache_size=400,\n                 auto_reload=True,\n                 bytecode_cache=None):\n        # !!Important notice!!\n        #   The constructor accepts quite a few arguments that should be\n        #   passed by keyword rather than position.  However it's important to\n        #   not change the order of arguments because it's used at least\n        #   internally in those cases:\n        #       -   spontaneous environments (i18n extension and Template)\n        #       -   unittests\n        #   If parameter changes are required only add parameters at the end\n        #   and don't change the arguments (or the defaults!) of the arguments\n        #   existing already.\n\n        # lexer / parser information\n        self.block_start_string = block_start_string\n        self.block_end_string = block_end_string\n        self.variable_start_string = variable_start_string\n        self.variable_end_string = variable_end_string\n        self.comment_start_string = comment_start_string\n        self.comment_end_string = comment_end_string\n        self.line_statement_prefix = line_statement_prefix\n        self.line_comment_prefix = line_comment_prefix\n        self.trim_blocks = trim_blocks\n        self.lstrip_blocks = lstrip_blocks\n        self.newline_sequence = newline_sequence\n        self.keep_trailing_newline = keep_trailing_newline\n\n        # runtime information\n        self.undefined = undefined\n        self.optimized = optimized\n        self.finalize = finalize\n        self.autoescape = autoescape\n\n        # defaults\n        self.filters = DEFAULT_FILTERS.copy()\n        self.tests = DEFAULT_TESTS.copy()\n        self.globals = DEFAULT_NAMESPACE.copy()\n\n        # set the loader provided\n        self.loader = loader\n        self.cache = create_cache(cache_size)\n        self.bytecode_cache = bytecode_cache\n        self.auto_reload = auto_reload\n\n        # load extensions\n        self.extensions = load_extensions(self, extensions)\n\n        _environment_sanity_check(self)\n\n    def add_extension(self, extension):\n        \"\"\"Adds an extension after the environment was created.\n\n        .. versionadded:: 2.5\n        \"\"\"\n        self.extensions.update(load_extensions(self, [extension]))\n\n    def extend(self, **attributes):\n        \"\"\"Add the items to the instance of the environment if they do not exist\n        yet.  This is used by :ref:`extensions <writing-extensions>` to register\n        callbacks and configuration values without breaking inheritance.\n        \"\"\"\n        for key, value in iteritems(attributes):\n            if not hasattr(self, key):\n                setattr(self, key, value)\n\n    def overlay(self, block_start_string=missing, block_end_string=missing,\n                variable_start_string=missing, variable_end_string=missing,\n                comment_start_string=missing, comment_end_string=missing,\n                line_statement_prefix=missing, line_comment_prefix=missing,\n                trim_blocks=missing, lstrip_blocks=missing,\n                extensions=missing, optimized=missing,\n                undefined=missing, finalize=missing, autoescape=missing,\n                loader=missing, cache_size=missing, auto_reload=missing,\n                bytecode_cache=missing):\n        \"\"\"Create a new overlay environment that shares all the data with the\n        current environment except for cache and the overridden attributes.\n        Extensions cannot be removed for an overlayed environment.  An overlayed\n        environment automatically gets all the extensions of the environment it\n        is linked to plus optional extra extensions.\n\n        Creating overlays should happen after the initial environment was set\n        up completely.  Not all attributes are truly linked, some are just\n        copied over so modifications on the original environment may not shine\n        through.\n        \"\"\"\n        args = dict(locals())\n        del args['self'], args['cache_size'], args['extensions']\n\n        rv = object.__new__(self.__class__)\n        rv.__dict__.update(self.__dict__)\n        rv.overlayed = True\n        rv.linked_to = self\n\n        for key, value in iteritems(args):\n            if value is not missing:\n                setattr(rv, key, value)\n\n        if cache_size is not missing:\n            rv.cache = create_cache(cache_size)\n        else:\n            rv.cache = copy_cache(self.cache)\n\n        rv.extensions = {}\n        for key, value in iteritems(self.extensions):\n            rv.extensions[key] = value.bind(rv)\n        if extensions is not missing:\n            rv.extensions.update(load_extensions(rv, extensions))\n\n        return _environment_sanity_check(rv)\n\n    lexer = property(get_lexer, doc=\"The lexer for this environment.\")\n\n    def iter_extensions(self):\n        \"\"\"Iterates over the extensions by priority.\"\"\"\n        return iter(sorted(self.extensions.values(),\n                           key=lambda x: x.priority))\n\n    def getitem(self, obj, argument):\n        \"\"\"Get an item or attribute of an object but prefer the item.\"\"\"\n        try:\n            return obj[argument]\n        except (TypeError, LookupError):\n            if isinstance(argument, string_types):\n                try:\n                    attr = str(argument)\n                except Exception:\n                    pass\n                else:\n                    try:\n                        return getattr(obj, attr)\n                    except AttributeError:\n                        pass\n            return self.undefined(obj=obj, name=argument)\n\n    def getattr(self, obj, attribute):\n        \"\"\"Get an item or attribute of an object but prefer the attribute.\n        Unlike :meth:`getitem` the attribute *must* be a bytestring.\n        \"\"\"\n        try:\n            return getattr(obj, attribute)\n        except AttributeError:\n            pass\n        try:\n            return obj[attribute]\n        except (TypeError, LookupError, AttributeError):\n            return self.undefined(obj=obj, name=attribute)\n\n    def call_filter(self, name, value, args=None, kwargs=None,\n                    context=None, eval_ctx=None):\n        \"\"\"Invokes a filter on a value the same way the compiler does it.\n\n        .. versionadded:: 2.7\n        \"\"\"\n        func = self.filters.get(name)\n        if func is None:\n            raise TemplateRuntimeError('no filter named %r' % name)\n        args = [value] + list(args or ())\n        if getattr(func, 'contextfilter', False):\n            if context is None:\n                raise TemplateRuntimeError('Attempted to invoke context '\n                                           'filter without context')\n            args.insert(0, context)\n        elif getattr(func, 'evalcontextfilter', False):\n            if eval_ctx is None:\n                if context is not None:\n                    eval_ctx = context.eval_ctx\n                else:\n                    eval_ctx = EvalContext(self)\n            args.insert(0, eval_ctx)\n        elif getattr(func, 'environmentfilter', False):\n            args.insert(0, self)\n        return func(*args, **(kwargs or {}))\n\n    def call_test(self, name, value, args=None, kwargs=None):\n        \"\"\"Invokes a test on a value the same way the compiler does it.\n\n        .. versionadded:: 2.7\n        \"\"\"\n        func = self.tests.get(name)\n        if func is None:\n            raise TemplateRuntimeError('no test named %r' % name)\n        return func(value, *(args or ()), **(kwargs or {}))\n\n    @internalcode\n    def parse(self, source, name=None, filename=None):\n        \"\"\"Parse the sourcecode and return the abstract syntax tree.  This\n        tree of nodes is used by the compiler to convert the template into\n        executable source- or bytecode.  This is useful for debugging or to\n        extract information from templates.\n\n        If you are :ref:`developing Jinja2 extensions <writing-extensions>`\n        this gives you a good overview of the node tree generated.\n        \"\"\"\n        try:\n            return self._parse(source, name, filename)\n        except TemplateSyntaxError:\n            exc_info = sys.exc_info()\n        self.handle_exception(exc_info, source_hint=source)\n\n    def _parse(self, source, name, filename):\n        \"\"\"Internal parsing function used by `parse` and `compile`.\"\"\"\n        return Parser(self, source, name, encode_filename(filename)).parse()\n\n    def lex(self, source, name=None, filename=None):\n        \"\"\"Lex the given sourcecode and return a generator that yields\n        tokens as tuples in the form ``(lineno, token_type, value)``.\n        This can be useful for :ref:`extension development <writing-extensions>`\n        and debugging templates.\n\n        This does not perform preprocessing.  If you want the preprocessing\n        of the extensions to be applied you have to filter source through\n        the :meth:`preprocess` method.\n        \"\"\"\n        source = text_type(source)\n        try:\n            return self.lexer.tokeniter(source, name, filename)\n        except TemplateSyntaxError:\n            exc_info = sys.exc_info()\n        self.handle_exception(exc_info, source_hint=source)\n\n    def preprocess(self, source, name=None, filename=None):\n        \"\"\"Preprocesses the source with all extensions.  This is automatically\n        called for all parsing and compiling methods but *not* for :meth:`lex`\n        because there you usually only want the actual source tokenized.\n        \"\"\"\n        return reduce(lambda s, e: e.preprocess(s, name, filename),\n                      self.iter_extensions(), text_type(source))\n\n    def _tokenize(self, source, name, filename=None, state=None):\n        \"\"\"Called by the parser to do the preprocessing and filtering\n        for all the extensions.  Returns a :class:`~jinja2.lexer.TokenStream`.\n        \"\"\"\n        source = self.preprocess(source, name, filename)\n        stream = self.lexer.tokenize(source, name, filename, state)\n        for ext in self.iter_extensions():\n            stream = ext.filter_stream(stream)\n            if not isinstance(stream, TokenStream):\n                stream = TokenStream(stream, name, filename)\n        return stream\n\n    def _generate(self, source, name, filename, defer_init=False):\n        \"\"\"Internal hook that can be overridden to hook a different generate\n        method in.\n\n        .. versionadded:: 2.5\n        \"\"\"\n        return generate(source, self, name, filename, defer_init=defer_init)\n\n    def _compile(self, source, filename):\n        \"\"\"Internal hook that can be overridden to hook a different compile\n        method in.\n\n        .. versionadded:: 2.5\n        \"\"\"\n        return compile(source, filename, 'exec')\n\n    @internalcode\n    def compile(self, source, name=None, filename=None, raw=False,\n                defer_init=False):\n        \"\"\"Compile a node or template source code.  The `name` parameter is\n        the load name of the template after it was joined using\n        :meth:`join_path` if necessary, not the filename on the file system.\n        the `filename` parameter is the estimated filename of the template on\n        the file system.  If the template came from a database or memory this\n        can be omitted.\n\n        The return value of this method is a python code object.  If the `raw`\n        parameter is `True` the return value will be a string with python\n        code equivalent to the bytecode returned otherwise.  This method is\n        mainly used internally.\n\n        `defer_init` is use internally to aid the module code generator.  This\n        causes the generated code to be able to import without the global\n        environment variable to be set.\n\n        .. versionadded:: 2.4\n           `defer_init` parameter added.\n        \"\"\"\n        source_hint = None\n        try:\n            if isinstance(source, string_types):\n                source_hint = source\n                source = self._parse(source, name, filename)\n            if self.optimized:\n                source = optimize(source, self)\n            source = self._generate(source, name, filename,\n                                    defer_init=defer_init)\n            if raw:\n                return source\n            if filename is None:\n                filename = '<template>'\n            else:\n                filename = encode_filename(filename)\n            return self._compile(source, filename)\n        except TemplateSyntaxError:\n            exc_info = sys.exc_info()\n        self.handle_exception(exc_info, source_hint=source_hint)\n\n    def compile_expression(self, source, undefined_to_none=True):\n        \"\"\"A handy helper method that returns a callable that accepts keyword\n        arguments that appear as variables in the expression.  If called it\n        returns the result of the expression.\n\n        This is useful if applications want to use the same rules as Jinja\n        in template \"configuration files\" or similar situations.\n\n        Example usage:\n\n        >>> env = Environment()\n        >>> expr = env.compile_expression('foo == 42')\n        >>> expr(foo=23)\n        False\n        >>> expr(foo=42)\n        True\n\n        Per default the return value is converted to `None` if the\n        expression returns an undefined value.  This can be changed\n        by setting `undefined_to_none` to `False`.\n\n        >>> env.compile_expression('var')() is None\n        True\n        >>> env.compile_expression('var', undefined_to_none=False)()\n        Undefined\n\n        .. versionadded:: 2.1\n        \"\"\"\n        parser = Parser(self, source, state='variable')\n        exc_info = None\n        try:\n            expr = parser.parse_expression()\n            if not parser.stream.eos:\n                raise TemplateSyntaxError('chunk after expression',\n                                          parser.stream.current.lineno,\n                                          None, None)\n            expr.set_environment(self)\n        except TemplateSyntaxError:\n            exc_info = sys.exc_info()\n        if exc_info is not None:\n            self.handle_exception(exc_info, source_hint=source)\n        body = [nodes.Assign(nodes.Name('result', 'store'), expr, lineno=1)]\n        template = self.from_string(nodes.Template(body, lineno=1))\n        return TemplateExpression(template, undefined_to_none)\n\n    def compile_templates(self, target, extensions=None, filter_func=None,\n                          zip='deflated', log_function=None,\n                          ignore_errors=True, py_compile=False):\n        \"\"\"Finds all the templates the loader can find, compiles them\n        and stores them in `target`.  If `zip` is `None`, instead of in a\n        zipfile, the templates will be stored in a directory.\n        By default a deflate zip algorithm is used. To switch to\n        the stored algorithm, `zip` can be set to ``'stored'``.\n\n        `extensions` and `filter_func` are passed to :meth:`list_templates`.\n        Each template returned will be compiled to the target folder or\n        zipfile.\n\n        By default template compilation errors are ignored.  In case a\n        log function is provided, errors are logged.  If you want template\n        syntax errors to abort the compilation you can set `ignore_errors`\n        to `False` and you will get an exception on syntax errors.\n\n        If `py_compile` is set to `True` .pyc files will be written to the\n        target instead of standard .py files.  This flag does not do anything\n        on pypy and Python 3 where pyc files are not picked up by itself and\n        don't give much benefit.\n\n        .. versionadded:: 2.4\n        \"\"\"\n        from jinja2.loaders import ModuleLoader\n\n        if log_function is None:\n            log_function = lambda x: None\n\n        if py_compile:\n            if not PY2 or PYPY:\n                from warnings import warn\n                warn(Warning('py_compile has no effect on pypy or Python 3'))\n                py_compile = False\n            else:\n                import imp\n                import marshal\n                py_header = imp.get_magic() + \\\n                    u'\\xff\\xff\\xff\\xff'.encode('iso-8859-15')\n\n                # Python 3.3 added a source filesize to the header\n                if sys.version_info >= (3, 3):\n                    py_header += u'\\x00\\x00\\x00\\x00'.encode('iso-8859-15')\n\n        def write_file(filename, data, mode):\n            if zip:\n                info = ZipInfo(filename)\n                info.external_attr = 0o755 << 16\n                zip_file.writestr(info, data)\n            else:\n                f = open(os.path.join(target, filename), mode)\n                try:\n                    f.write(data)\n                finally:\n                    f.close()\n\n        if zip is not None:\n            from zipfile import ZipFile, ZipInfo, ZIP_DEFLATED, ZIP_STORED\n            zip_file = ZipFile(target, 'w', dict(deflated=ZIP_DEFLATED,\n                                                 stored=ZIP_STORED)[zip])\n            log_function('Compiling into Zip archive \"%s\"' % target)\n        else:\n            if not os.path.isdir(target):\n                os.makedirs(target)\n            log_function('Compiling into folder \"%s\"' % target)\n\n        try:\n            for name in self.list_templates(extensions, filter_func):\n                source, filename, _ = self.loader.get_source(self, name)\n                try:\n                    code = self.compile(source, name, filename, True, True)\n                except TemplateSyntaxError as e:\n                    if not ignore_errors:\n                        raise\n                    log_function('Could not compile \"%s\": %s' % (name, e))\n                    continue\n\n                filename = ModuleLoader.get_module_filename(name)\n\n                if py_compile:\n                    c = self._compile(code, encode_filename(filename))\n                    write_file(filename + 'c', py_header +\n                               marshal.dumps(c), 'wb')\n                    log_function('Byte-compiled \"%s\" as %s' %\n                                 (name, filename + 'c'))\n                else:\n                    write_file(filename, code, 'w')\n                    log_function('Compiled \"%s\" as %s' % (name, filename))\n        finally:\n            if zip:\n                zip_file.close()\n\n        log_function('Finished compiling templates')\n\n    def list_templates(self, extensions=None, filter_func=None):\n        \"\"\"Returns a list of templates for this environment.  This requires\n        that the loader supports the loader's\n        :meth:`~BaseLoader.list_templates` method.\n\n        If there are other files in the template folder besides the\n        actual templates, the returned list can be filtered.  There are two\n        ways: either `extensions` is set to a list of file extensions for\n        templates, or a `filter_func` can be provided which is a callable that\n        is passed a template name and should return `True` if it should end up\n        in the result list.\n\n        If the loader does not support that, a :exc:`TypeError` is raised.\n\n        .. versionadded:: 2.4\n        \"\"\"\n        x = self.loader.list_templates()\n        if extensions is not None:\n            if filter_func is not None:\n                raise TypeError('either extensions or filter_func '\n                                'can be passed, but not both')\n            filter_func = lambda x: '.' in x and \\\n                                    x.rsplit('.', 1)[1] in extensions\n        if filter_func is not None:\n            x = list(ifilter(filter_func, x))\n        return x\n\n    def handle_exception(self, exc_info=None, rendered=False, source_hint=None):\n        \"\"\"Exception handling helper.  This is used internally to either raise\n        rewritten exceptions or return a rendered traceback for the template.\n        \"\"\"\n        global _make_traceback\n        if exc_info is None:\n            exc_info = sys.exc_info()\n\n        # the debugging module is imported when it's used for the first time.\n        # we're doing a lot of stuff there and for applications that do not\n        # get any exceptions in template rendering there is no need to load\n        # all of that.\n        if _make_traceback is None:\n            from jinja2.debug import make_traceback as _make_traceback\n        traceback = _make_traceback(exc_info, source_hint)\n        if rendered and self.exception_formatter is not None:\n            return self.exception_formatter(traceback)\n        if self.exception_handler is not None:\n            self.exception_handler(traceback)\n        exc_type, exc_value, tb = traceback.standard_exc_info\n        reraise(exc_type, exc_value, tb)\n\n    def join_path(self, template, parent):\n        \"\"\"Join a template with the parent.  By default all the lookups are\n        relative to the loader root so this method returns the `template`\n        parameter unchanged, but if the paths should be relative to the\n        parent template, this function can be used to calculate the real\n        template name.\n\n        Subclasses may override this method and implement template path\n        joining here.\n        \"\"\"\n        return template\n\n    @internalcode\n    def _load_template(self, name, globals):\n        if self.loader is None:\n            raise TypeError('no loader for this environment specified')\n        try:\n            # use abs path for cache key\n            cache_key = self.loader.get_source(self, name)[1]\n        except RuntimeError:\n            # if loader does not implement get_source()\n            cache_key = None\n        # if template is not file, use name for cache key\n        if cache_key is None:\n            cache_key = name\n        if self.cache is not None:\n            template = self.cache.get(cache_key)\n            if template is not None and (not self.auto_reload or\n                                         template.is_up_to_date):\n                return template\n        template = self.loader.load(self, name, globals)\n        if self.cache is not None:\n            self.cache[cache_key] = template\n        return template\n\n    @internalcode\n    def get_template(self, name, parent=None, globals=None):\n        \"\"\"Load a template from the loader.  If a loader is configured this\n        method ask the loader for the template and returns a :class:`Template`.\n        If the `parent` parameter is not `None`, :meth:`join_path` is called\n        to get the real template name before loading.\n\n        The `globals` parameter can be used to provide template wide globals.\n        These variables are available in the context at render time.\n\n        If the template does not exist a :exc:`TemplateNotFound` exception is\n        raised.\n\n        .. versionchanged:: 2.4\n           If `name` is a :class:`Template` object it is returned from the\n           function unchanged.\n        \"\"\"\n        if isinstance(name, Template):\n            return name\n        if parent is not None:\n            name = self.join_path(name, parent)\n        return self._load_template(name, self.make_globals(globals))\n\n    @internalcode\n    def select_template(self, names, parent=None, globals=None):\n        \"\"\"Works like :meth:`get_template` but tries a number of templates\n        before it fails.  If it cannot find any of the templates, it will\n        raise a :exc:`TemplatesNotFound` exception.\n\n        .. versionadded:: 2.3\n\n        .. versionchanged:: 2.4\n           If `names` contains a :class:`Template` object it is returned\n           from the function unchanged.\n        \"\"\"\n        if not names:\n            raise TemplatesNotFound(message=u'Tried to select from an empty list '\n                                            u'of templates.')\n        globals = self.make_globals(globals)\n        for name in names:\n            if isinstance(name, Template):\n                return name\n            if parent is not None:\n                name = self.join_path(name, parent)\n            try:\n                return self._load_template(name, globals)\n            except TemplateNotFound:\n                pass\n        raise TemplatesNotFound(names)\n\n    @internalcode\n    def get_or_select_template(self, template_name_or_list,\n                               parent=None, globals=None):\n        \"\"\"Does a typecheck and dispatches to :meth:`select_template`\n        if an iterable of template names is given, otherwise to\n        :meth:`get_template`.\n\n        .. versionadded:: 2.3\n        \"\"\"\n        if isinstance(template_name_or_list, string_types):\n            return self.get_template(template_name_or_list, parent, globals)\n        elif isinstance(template_name_or_list, Template):\n            return template_name_or_list\n        return self.select_template(template_name_or_list, parent, globals)\n\n    def from_string(self, source, globals=None, template_class=None):\n        \"\"\"Load a template from a string.  This parses the source given and\n        returns a :class:`Template` object.\n        \"\"\"\n        globals = self.make_globals(globals)\n        cls = template_class or self.template_class\n        return cls.from_code(self, self.compile(source), globals, None)\n\n    def make_globals(self, d):\n        \"\"\"Return a dict for the globals.\"\"\"\n        if not d:\n            return self.globals\n        return dict(self.globals, **d)\n\n\nclass Template(object):\n    \"\"\"The central template object.  This class represents a compiled template\n    and is used to evaluate it.\n\n    Normally the template object is generated from an :class:`Environment` but\n    it also has a constructor that makes it possible to create a template\n    instance directly using the constructor.  It takes the same arguments as\n    the environment constructor but it's not possible to specify a loader.\n\n    Every template object has a few methods and members that are guaranteed\n    to exist.  However it's important that a template object should be\n    considered immutable.  Modifications on the object are not supported.\n\n    Template objects created from the constructor rather than an environment\n    do have an `environment` attribute that points to a temporary environment\n    that is probably shared with other templates created with the constructor\n    and compatible settings.\n\n    >>> template = Template('Hello {{ name }}!')\n    >>> template.render(name='John Doe') == u'Hello John Doe!'\n    True\n    >>> stream = template.stream(name='John Doe')\n    >>> next(stream) == u'Hello John Doe!'\n    True\n    >>> next(stream)\n    Traceback (most recent call last):\n        ...\n    StopIteration\n    \"\"\"\n\n    def __new__(cls, source,\n                block_start_string=BLOCK_START_STRING,\n                block_end_string=BLOCK_END_STRING,\n                variable_start_string=VARIABLE_START_STRING,\n                variable_end_string=VARIABLE_END_STRING,\n                comment_start_string=COMMENT_START_STRING,\n                comment_end_string=COMMENT_END_STRING,\n                line_statement_prefix=LINE_STATEMENT_PREFIX,\n                line_comment_prefix=LINE_COMMENT_PREFIX,\n                trim_blocks=TRIM_BLOCKS,\n                lstrip_blocks=LSTRIP_BLOCKS,\n                newline_sequence=NEWLINE_SEQUENCE,\n                keep_trailing_newline=KEEP_TRAILING_NEWLINE,\n                extensions=(),\n                optimized=True,\n                undefined=Undefined,\n                finalize=None,\n                autoescape=False):\n        env = get_spontaneous_environment(\n            block_start_string, block_end_string, variable_start_string,\n            variable_end_string, comment_start_string, comment_end_string,\n            line_statement_prefix, line_comment_prefix, trim_blocks,\n            lstrip_blocks, newline_sequence, keep_trailing_newline,\n            frozenset(extensions), optimized, undefined, finalize, autoescape,\n            None, 0, False, None)\n        return env.from_string(source, template_class=cls)\n\n    @classmethod\n    def from_code(cls, environment, code, globals, uptodate=None):\n        \"\"\"Creates a template object from compiled code and the globals.  This\n        is used by the loaders and environment to create a template object.\n        \"\"\"\n        namespace = {\n            'environment':  environment,\n            '__file__':     code.co_filename\n        }\n        exec(code, namespace)\n        rv = cls._from_namespace(environment, namespace, globals)\n        rv._uptodate = uptodate\n        return rv\n\n    @classmethod\n    def from_module_dict(cls, environment, module_dict, globals):\n        \"\"\"Creates a template object from a module.  This is used by the\n        module loader to create a template object.\n\n        .. versionadded:: 2.4\n        \"\"\"\n        return cls._from_namespace(environment, module_dict, globals)\n\n    @classmethod\n    def _from_namespace(cls, environment, namespace, globals):\n        t = object.__new__(cls)\n        t.environment = environment\n        t.globals = globals\n        t.name = namespace['name']\n        t.filename = namespace['__file__']\n        t.blocks = namespace['blocks']\n\n        # render function and module\n        t.root_render_func = namespace['root']\n        t._module = None\n\n        # debug and loader helpers\n        t._debug_info = namespace['debug_info']\n        t._uptodate = None\n\n        # store the reference\n        namespace['environment'] = environment\n        namespace['__jinja_template__'] = t\n\n        return t\n\n    def render(self, *args, **kwargs):\n        \"\"\"This method accepts the same arguments as the `dict` constructor:\n        A dict, a dict subclass or some keyword arguments.  If no arguments\n        are given the context will be empty.  These two calls do the same::\n\n            template.render(knights='that say nih')\n            template.render({'knights': 'that say nih'})\n\n        This will return the rendered template as unicode string.\n        \"\"\"\n        vars = dict(*args, **kwargs)\n        try:\n            return concat(self.root_render_func(self.new_context(vars)))\n        except Exception:\n            exc_info = sys.exc_info()\n        return self.environment.handle_exception(exc_info, True)\n\n    def stream(self, *args, **kwargs):\n        \"\"\"Works exactly like :meth:`generate` but returns a\n        :class:`TemplateStream`.\n        \"\"\"\n        return TemplateStream(self.generate(*args, **kwargs))\n\n    def generate(self, *args, **kwargs):\n        \"\"\"For very large templates it can be useful to not render the whole\n        template at once but evaluate each statement after another and yield\n        piece for piece.  This method basically does exactly that and returns\n        a generator that yields one item after another as unicode strings.\n\n        It accepts the same arguments as :meth:`render`.\n        \"\"\"\n        vars = dict(*args, **kwargs)\n        try:\n            for event in self.root_render_func(self.new_context(vars)):\n                yield event\n        except Exception:\n            exc_info = sys.exc_info()\n        else:\n            return\n        yield self.environment.handle_exception(exc_info, True)\n\n    def new_context(self, vars=None, shared=False, locals=None):\n        \"\"\"Create a new :class:`Context` for this template.  The vars\n        provided will be passed to the template.  Per default the globals\n        are added to the context.  If shared is set to `True` the data\n        is passed as it to the context without adding the globals.\n\n        `locals` can be a dict of local variables for internal usage.\n        \"\"\"\n        return new_context(self.environment, self.name, self.blocks,\n                           vars, shared, self.globals, locals)\n\n    def make_module(self, vars=None, shared=False, locals=None):\n        \"\"\"This method works like the :attr:`module` attribute when called\n        without arguments but it will evaluate the template on every call\n        rather than caching it.  It's also possible to provide\n        a dict which is then used as context.  The arguments are the same\n        as for the :meth:`new_context` method.\n        \"\"\"\n        return TemplateModule(self, self.new_context(vars, shared, locals))\n\n    @property\n    def module(self):\n        \"\"\"The template as module.  This is used for imports in the\n        template runtime but is also useful if one wants to access\n        exported template variables from the Python layer:\n\n        >>> t = Template('{% macro foo() %}42{% endmacro %}23')\n        >>> str(t.module)\n        '23'\n        >>> t.module.foo() == u'42'\n        True\n        \"\"\"\n        if self._module is not None:\n            return self._module\n        self._module = rv = self.make_module()\n        return rv\n\n    def get_corresponding_lineno(self, lineno):\n        \"\"\"Return the source line number of a line number in the\n        generated bytecode as they are not in sync.\n        \"\"\"\n        for template_line, code_line in reversed(self.debug_info):\n            if code_line <= lineno:\n                return template_line\n        return 1\n\n    @property\n    def is_up_to_date(self):\n        \"\"\"If this variable is `False` there is a newer version available.\"\"\"\n        if self._uptodate is None:\n            return True\n        return self._uptodate()\n\n    @property\n    def debug_info(self):\n        \"\"\"The debug info mapping.\"\"\"\n        return [tuple(imap(int, x.split('='))) for x in\n                self._debug_info.split('&')]\n\n    def __repr__(self):\n        if self.name is None:\n            name = 'memory:%x' % id(self)\n        else:\n            name = repr(self.name)\n        return '<%s %s>' % (self.__class__.__name__, name)\n\n\n@implements_to_string\nclass TemplateModule(object):\n    \"\"\"Represents an imported template.  All the exported names of the\n    template are available as attributes on this object.  Additionally\n    converting it into an unicode- or bytestrings renders the contents.\n    \"\"\"\n\n    def __init__(self, template, context):\n        self._body_stream = list(template.root_render_func(context))\n        self.__dict__.update(context.get_exported())\n        self.__name__ = template.name\n\n    def __html__(self):\n        return Markup(concat(self._body_stream))\n\n    def __str__(self):\n        return concat(self._body_stream)\n\n    def __repr__(self):\n        if self.__name__ is None:\n            name = 'memory:%x' % id(self)\n        else:\n            name = repr(self.__name__)\n        return '<%s %s>' % (self.__class__.__name__, name)\n\n\nclass TemplateExpression(object):\n    \"\"\"The :meth:`jinja2.Environment.compile_expression` method returns an\n    instance of this object.  It encapsulates the expression-like access\n    to the template with an expression it wraps.\n    \"\"\"\n\n    def __init__(self, template, undefined_to_none):\n        self._template = template\n        self._undefined_to_none = undefined_to_none\n\n    def __call__(self, *args, **kwargs):\n        context = self._template.new_context(dict(*args, **kwargs))\n        consume(self._template.root_render_func(context))\n        rv = context.vars['result']\n        if self._undefined_to_none and isinstance(rv, Undefined):\n            rv = None\n        return rv\n\n\n@implements_iterator\nclass TemplateStream(object):\n    \"\"\"A template stream works pretty much like an ordinary python generator\n    but it can buffer multiple items to reduce the number of total iterations.\n    Per default the output is unbuffered which means that for every unbuffered\n    instruction in the template one unicode string is yielded.\n\n    If buffering is enabled with a buffer size of 5, five items are combined\n    into a new unicode string.  This is mainly useful if you are streaming\n    big templates to a client via WSGI which flushes after each iteration.\n    \"\"\"\n\n    def __init__(self, gen):\n        self._gen = gen\n        self.disable_buffering()\n\n    def dump(self, fp, encoding=None, errors='strict'):\n        \"\"\"Dump the complete stream into a file or file-like object.\n        Per default unicode strings are written, if you want to encode\n        before writing specify an `encoding`.\n\n        Example usage::\n\n            Template('Hello {{ name }}!').stream(name='foo').dump('hello.html')\n        \"\"\"\n        close = False\n        if isinstance(fp, string_types):\n            if encoding is None:\n                encoding = 'utf-8'\n            fp = open(fp, 'wb')\n            close = True\n        try:\n            if encoding is not None:\n                iterable = (x.encode(encoding, errors) for x in self)\n            else:\n                iterable = self\n            if hasattr(fp, 'writelines'):\n                fp.writelines(iterable)\n            else:\n                for item in iterable:\n                    fp.write(item)\n        finally:\n            if close:\n                fp.close()\n\n    def disable_buffering(self):\n        \"\"\"Disable the output buffering.\"\"\"\n        self._next = get_next(self._gen)\n        self.buffered = False\n\n    def enable_buffering(self, size=5):\n        \"\"\"Enable buffering.  Buffer `size` items before yielding them.\"\"\"\n        if size <= 1:\n            raise ValueError('buffer size too small')\n\n        def generator(next):\n            buf = []\n            c_size = 0\n            push = buf.append\n\n            while 1:\n                try:\n                    while c_size < size:\n                        c = next()\n                        push(c)\n                        if c:\n                            c_size += 1\n                except StopIteration:\n                    if not c_size:\n                        return\n                yield concat(buf)\n                del buf[:]\n                c_size = 0\n\n        self.buffered = True\n        self._next = get_next(generator(get_next(self._gen)))\n\n    def __iter__(self):\n        return self\n\n    def __next__(self):\n        return self._next()\n\n\n# hook in default template class.  if anyone reads this comment: ignore that\n# it's possible to use custom templates ;-)\nEnvironment.template_class = Template\n"
  },
  {
    "path": "lib/jinja2/exceptions.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    jinja2.exceptions\n    ~~~~~~~~~~~~~~~~~\n\n    Jinja exceptions.\n\n    :copyright: (c) 2010 by the Jinja Team.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nfrom jinja2._compat import imap, text_type, PY2, implements_to_string\n\n\nclass TemplateError(Exception):\n    \"\"\"Baseclass for all template errors.\"\"\"\n\n    if PY2:\n        def __init__(self, message=None):\n            if message is not None:\n                message = text_type(message).encode('utf-8')\n            Exception.__init__(self, message)\n\n        @property\n        def message(self):\n            if self.args:\n                message = self.args[0]\n                if message is not None:\n                    return message.decode('utf-8', 'replace')\n\n        def __unicode__(self):\n            return self.message or u''\n    else:\n        def __init__(self, message=None):\n            Exception.__init__(self, message)\n\n        @property\n        def message(self):\n            if self.args:\n                message = self.args[0]\n                if message is not None:\n                    return message\n\n\n@implements_to_string\nclass TemplateNotFound(IOError, LookupError, TemplateError):\n    \"\"\"Raised if a template does not exist.\"\"\"\n\n    # looks weird, but removes the warning descriptor that just\n    # bogusly warns us about message being deprecated\n    message = None\n\n    def __init__(self, name, message=None):\n        IOError.__init__(self)\n        if message is None:\n            message = name\n        self.message = message\n        self.name = name\n        self.templates = [name]\n\n    def __str__(self):\n        return self.message\n\n\nclass TemplatesNotFound(TemplateNotFound):\n    \"\"\"Like :class:`TemplateNotFound` but raised if multiple templates\n    are selected.  This is a subclass of :class:`TemplateNotFound`\n    exception, so just catching the base exception will catch both.\n\n    .. versionadded:: 2.2\n    \"\"\"\n\n    def __init__(self, names=(), message=None):\n        if message is None:\n            message = u'none of the templates given were found: ' + \\\n                      u', '.join(imap(text_type, names))\n        TemplateNotFound.__init__(self, names and names[-1] or None, message)\n        self.templates = list(names)\n\n\n@implements_to_string\nclass TemplateSyntaxError(TemplateError):\n    \"\"\"Raised to tell the user that there is a problem with the template.\"\"\"\n\n    def __init__(self, message, lineno, name=None, filename=None):\n        TemplateError.__init__(self, message)\n        self.lineno = lineno\n        self.name = name\n        self.filename = filename\n        self.source = None\n\n        # this is set to True if the debug.translate_syntax_error\n        # function translated the syntax error into a new traceback\n        self.translated = False\n\n    def __str__(self):\n        # for translated errors we only return the message\n        if self.translated:\n            return self.message\n\n        # otherwise attach some stuff\n        location = 'line %d' % self.lineno\n        name = self.filename or self.name\n        if name:\n            location = 'File \"%s\", %s' % (name, location)\n        lines = [self.message, '  ' + location]\n\n        # if the source is set, add the line to the output\n        if self.source is not None:\n            try:\n                line = self.source.splitlines()[self.lineno - 1]\n            except IndexError:\n                line = None\n            if line:\n                lines.append('    ' + line.strip())\n\n        return u'\\n'.join(lines)\n\n\nclass TemplateAssertionError(TemplateSyntaxError):\n    \"\"\"Like a template syntax error, but covers cases where something in the\n    template caused an error at compile time that wasn't necessarily caused\n    by a syntax error.  However it's a direct subclass of\n    :exc:`TemplateSyntaxError` and has the same attributes.\n    \"\"\"\n\n\nclass TemplateRuntimeError(TemplateError):\n    \"\"\"A generic runtime error in the template engine.  Under some situations\n    Jinja may raise this exception.\n    \"\"\"\n\n\nclass UndefinedError(TemplateRuntimeError):\n    \"\"\"Raised if a template tries to operate on :class:`Undefined`.\"\"\"\n\n\nclass SecurityError(TemplateRuntimeError):\n    \"\"\"Raised if a template tries to do something insecure if the\n    sandbox is enabled.\n    \"\"\"\n\n\nclass FilterArgumentError(TemplateRuntimeError):\n    \"\"\"This error is raised if a filter was called with inappropriate\n    arguments\n    \"\"\"\n"
  },
  {
    "path": "lib/jinja2/ext.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    jinja2.ext\n    ~~~~~~~~~~\n\n    Jinja extensions allow to add custom tags similar to the way django custom\n    tags work.  By default two example extensions exist: an i18n and a cache\n    extension.\n\n    :copyright: (c) 2010 by the Jinja Team.\n    :license: BSD.\n\"\"\"\nfrom jinja2 import nodes\nfrom jinja2.defaults import BLOCK_START_STRING, \\\n     BLOCK_END_STRING, VARIABLE_START_STRING, VARIABLE_END_STRING, \\\n     COMMENT_START_STRING, COMMENT_END_STRING, LINE_STATEMENT_PREFIX, \\\n     LINE_COMMENT_PREFIX, TRIM_BLOCKS, NEWLINE_SEQUENCE, \\\n     KEEP_TRAILING_NEWLINE, LSTRIP_BLOCKS\nfrom jinja2.environment import Environment\nfrom jinja2.runtime import concat\nfrom jinja2.exceptions import TemplateAssertionError, TemplateSyntaxError\nfrom jinja2.utils import contextfunction, import_string, Markup\nfrom jinja2._compat import with_metaclass, string_types, iteritems\n\n\n# the only real useful gettext functions for a Jinja template.  Note\n# that ugettext must be assigned to gettext as Jinja doesn't support\n# non unicode strings.\nGETTEXT_FUNCTIONS = ('_', 'gettext', 'ngettext')\n\n\nclass ExtensionRegistry(type):\n    \"\"\"Gives the extension an unique identifier.\"\"\"\n\n    def __new__(cls, name, bases, d):\n        rv = type.__new__(cls, name, bases, d)\n        rv.identifier = rv.__module__ + '.' + rv.__name__\n        return rv\n\n\nclass Extension(with_metaclass(ExtensionRegistry, object)):\n    \"\"\"Extensions can be used to add extra functionality to the Jinja template\n    system at the parser level.  Custom extensions are bound to an environment\n    but may not store environment specific data on `self`.  The reason for\n    this is that an extension can be bound to another environment (for\n    overlays) by creating a copy and reassigning the `environment` attribute.\n\n    As extensions are created by the environment they cannot accept any\n    arguments for configuration.  One may want to work around that by using\n    a factory function, but that is not possible as extensions are identified\n    by their import name.  The correct way to configure the extension is\n    storing the configuration values on the environment.  Because this way the\n    environment ends up acting as central configuration storage the\n    attributes may clash which is why extensions have to ensure that the names\n    they choose for configuration are not too generic.  ``prefix`` for example\n    is a terrible name, ``fragment_cache_prefix`` on the other hand is a good\n    name as includes the name of the extension (fragment cache).\n    \"\"\"\n\n    #: if this extension parses this is the list of tags it's listening to.\n    tags = set()\n\n    #: the priority of that extension.  This is especially useful for\n    #: extensions that preprocess values.  A lower value means higher\n    #: priority.\n    #:\n    #: .. versionadded:: 2.4\n    priority = 100\n\n    def __init__(self, environment):\n        self.environment = environment\n\n    def bind(self, environment):\n        \"\"\"Create a copy of this extension bound to another environment.\"\"\"\n        rv = object.__new__(self.__class__)\n        rv.__dict__.update(self.__dict__)\n        rv.environment = environment\n        return rv\n\n    def preprocess(self, source, name, filename=None):\n        \"\"\"This method is called before the actual lexing and can be used to\n        preprocess the source.  The `filename` is optional.  The return value\n        must be the preprocessed source.\n        \"\"\"\n        return source\n\n    def filter_stream(self, stream):\n        \"\"\"It's passed a :class:`~jinja2.lexer.TokenStream` that can be used\n        to filter tokens returned.  This method has to return an iterable of\n        :class:`~jinja2.lexer.Token`\\s, but it doesn't have to return a\n        :class:`~jinja2.lexer.TokenStream`.\n\n        In the `ext` folder of the Jinja2 source distribution there is a file\n        called `inlinegettext.py` which implements a filter that utilizes this\n        method.\n        \"\"\"\n        return stream\n\n    def parse(self, parser):\n        \"\"\"If any of the :attr:`tags` matched this method is called with the\n        parser as first argument.  The token the parser stream is pointing at\n        is the name token that matched.  This method has to return one or a\n        list of multiple nodes.\n        \"\"\"\n        raise NotImplementedError()\n\n    def attr(self, name, lineno=None):\n        \"\"\"Return an attribute node for the current extension.  This is useful\n        to pass constants on extensions to generated template code.\n\n        ::\n\n            self.attr('_my_attribute', lineno=lineno)\n        \"\"\"\n        return nodes.ExtensionAttribute(self.identifier, name, lineno=lineno)\n\n    def call_method(self, name, args=None, kwargs=None, dyn_args=None,\n                    dyn_kwargs=None, lineno=None):\n        \"\"\"Call a method of the extension.  This is a shortcut for\n        :meth:`attr` + :class:`jinja2.nodes.Call`.\n        \"\"\"\n        if args is None:\n            args = []\n        if kwargs is None:\n            kwargs = []\n        return nodes.Call(self.attr(name, lineno=lineno), args, kwargs,\n                          dyn_args, dyn_kwargs, lineno=lineno)\n\n\n@contextfunction\ndef _gettext_alias(__context, *args, **kwargs):\n    return __context.call(__context.resolve('gettext'), *args, **kwargs)\n\n\ndef _make_new_gettext(func):\n    @contextfunction\n    def gettext(__context, __string, **variables):\n        rv = __context.call(func, __string)\n        if __context.eval_ctx.autoescape:\n            rv = Markup(rv)\n        return rv % variables\n    return gettext\n\n\ndef _make_new_ngettext(func):\n    @contextfunction\n    def ngettext(__context, __singular, __plural, __num, **variables):\n        variables.setdefault('num', __num)\n        rv = __context.call(func, __singular, __plural, __num)\n        if __context.eval_ctx.autoescape:\n            rv = Markup(rv)\n        return rv % variables\n    return ngettext\n\n\nclass InternationalizationExtension(Extension):\n    \"\"\"This extension adds gettext support to Jinja2.\"\"\"\n    tags = set(['trans'])\n\n    # TODO: the i18n extension is currently reevaluating values in a few\n    # situations.  Take this example:\n    #   {% trans count=something() %}{{ count }} foo{% pluralize\n    #     %}{{ count }} fooss{% endtrans %}\n    # something is called twice here.  One time for the gettext value and\n    # the other time for the n-parameter of the ngettext function.\n\n    def __init__(self, environment):\n        Extension.__init__(self, environment)\n        environment.globals['_'] = _gettext_alias\n        environment.extend(\n            install_gettext_translations=self._install,\n            install_null_translations=self._install_null,\n            install_gettext_callables=self._install_callables,\n            uninstall_gettext_translations=self._uninstall,\n            extract_translations=self._extract,\n            newstyle_gettext=False\n        )\n\n    def _install(self, translations, newstyle=None):\n        gettext = getattr(translations, 'ugettext', None)\n        if gettext is None:\n            gettext = translations.gettext\n        ngettext = getattr(translations, 'ungettext', None)\n        if ngettext is None:\n            ngettext = translations.ngettext\n        self._install_callables(gettext, ngettext, newstyle)\n\n    def _install_null(self, newstyle=None):\n        self._install_callables(\n            lambda x: x,\n            lambda s, p, n: (n != 1 and (p,) or (s,))[0],\n            newstyle\n        )\n\n    def _install_callables(self, gettext, ngettext, newstyle=None):\n        if newstyle is not None:\n            self.environment.newstyle_gettext = newstyle\n        if self.environment.newstyle_gettext:\n            gettext = _make_new_gettext(gettext)\n            ngettext = _make_new_ngettext(ngettext)\n        self.environment.globals.update(\n            gettext=gettext,\n            ngettext=ngettext\n        )\n\n    def _uninstall(self, translations):\n        for key in 'gettext', 'ngettext':\n            self.environment.globals.pop(key, None)\n\n    def _extract(self, source, gettext_functions=GETTEXT_FUNCTIONS):\n        if isinstance(source, string_types):\n            source = self.environment.parse(source)\n        return extract_from_ast(source, gettext_functions)\n\n    def parse(self, parser):\n        \"\"\"Parse a translatable tag.\"\"\"\n        lineno = next(parser.stream).lineno\n        num_called_num = False\n\n        # find all the variables referenced.  Additionally a variable can be\n        # defined in the body of the trans block too, but this is checked at\n        # a later state.\n        plural_expr = None\n        plural_expr_assignment = None\n        variables = {}\n        while parser.stream.current.type != 'block_end':\n            if variables:\n                parser.stream.expect('comma')\n\n            # skip colon for python compatibility\n            if parser.stream.skip_if('colon'):\n                break\n\n            name = parser.stream.expect('name')\n            if name.value in variables:\n                parser.fail('translatable variable %r defined twice.' %\n                            name.value, name.lineno,\n                            exc=TemplateAssertionError)\n\n            # expressions\n            if parser.stream.current.type == 'assign':\n                next(parser.stream)\n                variables[name.value] = var = parser.parse_expression()\n            else:\n                variables[name.value] = var = nodes.Name(name.value, 'load')\n\n            if plural_expr is None:\n                if isinstance(var, nodes.Call):\n                    plural_expr = nodes.Name('_trans', 'load')\n                    variables[name.value] = plural_expr\n                    plural_expr_assignment = nodes.Assign(\n                        nodes.Name('_trans', 'store'), var)\n                else:\n                    plural_expr = var\n                num_called_num = name.value == 'num'\n\n        parser.stream.expect('block_end')\n\n        plural = plural_names = None\n        have_plural = False\n        referenced = set()\n\n        # now parse until endtrans or pluralize\n        singular_names, singular = self._parse_block(parser, True)\n        if singular_names:\n            referenced.update(singular_names)\n            if plural_expr is None:\n                plural_expr = nodes.Name(singular_names[0], 'load')\n                num_called_num = singular_names[0] == 'num'\n\n        # if we have a pluralize block, we parse that too\n        if parser.stream.current.test('name:pluralize'):\n            have_plural = True\n            next(parser.stream)\n            if parser.stream.current.type != 'block_end':\n                name = parser.stream.expect('name')\n                if name.value not in variables:\n                    parser.fail('unknown variable %r for pluralization' %\n                                name.value, name.lineno,\n                                exc=TemplateAssertionError)\n                plural_expr = variables[name.value]\n                num_called_num = name.value == 'num'\n            parser.stream.expect('block_end')\n            plural_names, plural = self._parse_block(parser, False)\n            next(parser.stream)\n            referenced.update(plural_names)\n        else:\n            next(parser.stream)\n\n        # register free names as simple name expressions\n        for var in referenced:\n            if var not in variables:\n                variables[var] = nodes.Name(var, 'load')\n\n        if not have_plural:\n            plural_expr = None\n        elif plural_expr is None:\n            parser.fail('pluralize without variables', lineno)\n\n        node = self._make_node(singular, plural, variables, plural_expr,\n                               bool(referenced),\n                               num_called_num and have_plural)\n        node.set_lineno(lineno)\n        if plural_expr_assignment is not None:\n            return [plural_expr_assignment, node]\n        else:\n            return node\n\n    def _parse_block(self, parser, allow_pluralize):\n        \"\"\"Parse until the next block tag with a given name.\"\"\"\n        referenced = []\n        buf = []\n        while 1:\n            if parser.stream.current.type == 'data':\n                buf.append(parser.stream.current.value.replace('%', '%%'))\n                next(parser.stream)\n            elif parser.stream.current.type == 'variable_begin':\n                next(parser.stream)\n                name = parser.stream.expect('name').value\n                referenced.append(name)\n                buf.append('%%(%s)s' % name)\n                parser.stream.expect('variable_end')\n            elif parser.stream.current.type == 'block_begin':\n                next(parser.stream)\n                if parser.stream.current.test('name:endtrans'):\n                    break\n                elif parser.stream.current.test('name:pluralize'):\n                    if allow_pluralize:\n                        break\n                    parser.fail('a translatable section can have only one '\n                                'pluralize section')\n                parser.fail('control structures in translatable sections are '\n                            'not allowed')\n            elif parser.stream.eos:\n                parser.fail('unclosed translation block')\n            else:\n                assert False, 'internal parser error'\n\n        return referenced, concat(buf)\n\n    def _make_node(self, singular, plural, variables, plural_expr,\n                   vars_referenced, num_called_num):\n        \"\"\"Generates a useful node from the data provided.\"\"\"\n        # no variables referenced?  no need to escape for old style\n        # gettext invocations only if there are vars.\n        if not vars_referenced and not self.environment.newstyle_gettext:\n            singular = singular.replace('%%', '%')\n            if plural:\n                plural = plural.replace('%%', '%')\n\n        # singular only:\n        if plural_expr is None:\n            gettext = nodes.Name('gettext', 'load')\n            node = nodes.Call(gettext, [nodes.Const(singular)],\n                              [], None, None)\n\n        # singular and plural\n        else:\n            ngettext = nodes.Name('ngettext', 'load')\n            node = nodes.Call(ngettext, [\n                nodes.Const(singular),\n                nodes.Const(plural),\n                plural_expr\n            ], [], None, None)\n\n        # in case newstyle gettext is used, the method is powerful\n        # enough to handle the variable expansion and autoescape\n        # handling itself\n        if self.environment.newstyle_gettext:\n            for key, value in iteritems(variables):\n                # the function adds that later anyways in case num was\n                # called num, so just skip it.\n                if num_called_num and key == 'num':\n                    continue\n                node.kwargs.append(nodes.Keyword(key, value))\n\n        # otherwise do that here\n        else:\n            # mark the return value as safe if we are in an\n            # environment with autoescaping turned on\n            node = nodes.MarkSafeIfAutoescape(node)\n            if variables:\n                node = nodes.Mod(node, nodes.Dict([\n                    nodes.Pair(nodes.Const(key), value)\n                    for key, value in variables.items()\n                ]))\n        return nodes.Output([node])\n\n\nclass ExprStmtExtension(Extension):\n    \"\"\"Adds a `do` tag to Jinja2 that works like the print statement just\n    that it doesn't print the return value.\n    \"\"\"\n    tags = set(['do'])\n\n    def parse(self, parser):\n        node = nodes.ExprStmt(lineno=next(parser.stream).lineno)\n        node.node = parser.parse_tuple()\n        return node\n\n\nclass LoopControlExtension(Extension):\n    \"\"\"Adds break and continue to the template engine.\"\"\"\n    tags = set(['break', 'continue'])\n\n    def parse(self, parser):\n        token = next(parser.stream)\n        if token.value == 'break':\n            return nodes.Break(lineno=token.lineno)\n        return nodes.Continue(lineno=token.lineno)\n\n\nclass WithExtension(Extension):\n    \"\"\"Adds support for a django-like with block.\"\"\"\n    tags = set(['with'])\n\n    def parse(self, parser):\n        node = nodes.Scope(lineno=next(parser.stream).lineno)\n        assignments = []\n        while parser.stream.current.type != 'block_end':\n            lineno = parser.stream.current.lineno\n            if assignments:\n                parser.stream.expect('comma')\n            target = parser.parse_assign_target()\n            parser.stream.expect('assign')\n            expr = parser.parse_expression()\n            assignments.append(nodes.Assign(target, expr, lineno=lineno))\n        node.body = assignments + \\\n            list(parser.parse_statements(('name:endwith',),\n                                         drop_needle=True))\n        return node\n\n\nclass AutoEscapeExtension(Extension):\n    \"\"\"Changes auto escape rules for a scope.\"\"\"\n    tags = set(['autoescape'])\n\n    def parse(self, parser):\n        node = nodes.ScopedEvalContextModifier(lineno=next(parser.stream).lineno)\n        node.options = [\n            nodes.Keyword('autoescape', parser.parse_expression())\n        ]\n        node.body = parser.parse_statements(('name:endautoescape',),\n                                            drop_needle=True)\n        return nodes.Scope([node])\n\n\ndef extract_from_ast(node, gettext_functions=GETTEXT_FUNCTIONS,\n                     babel_style=True):\n    \"\"\"Extract localizable strings from the given template node.  Per\n    default this function returns matches in babel style that means non string\n    parameters as well as keyword arguments are returned as `None`.  This\n    allows Babel to figure out what you really meant if you are using\n    gettext functions that allow keyword arguments for placeholder expansion.\n    If you don't want that behavior set the `babel_style` parameter to `False`\n    which causes only strings to be returned and parameters are always stored\n    in tuples.  As a consequence invalid gettext calls (calls without a single\n    string parameter or string parameters after non-string parameters) are\n    skipped.\n\n    This example explains the behavior:\n\n    >>> from jinja2 import Environment\n    >>> env = Environment()\n    >>> node = env.parse('{{ (_(\"foo\"), _(), ngettext(\"foo\", \"bar\", 42)) }}')\n    >>> list(extract_from_ast(node))\n    [(1, '_', 'foo'), (1, '_', ()), (1, 'ngettext', ('foo', 'bar', None))]\n    >>> list(extract_from_ast(node, babel_style=False))\n    [(1, '_', ('foo',)), (1, 'ngettext', ('foo', 'bar'))]\n\n    For every string found this function yields a ``(lineno, function,\n    message)`` tuple, where:\n\n    * ``lineno`` is the number of the line on which the string was found,\n    * ``function`` is the name of the ``gettext`` function used (if the\n      string was extracted from embedded Python code), and\n    *  ``message`` is the string itself (a ``unicode`` object, or a tuple\n       of ``unicode`` objects for functions with multiple string arguments).\n\n    This extraction function operates on the AST and is because of that unable\n    to extract any comments.  For comment support you have to use the babel\n    extraction interface or extract comments yourself.\n    \"\"\"\n    for node in node.find_all(nodes.Call):\n        if not isinstance(node.node, nodes.Name) or \\\n           node.node.name not in gettext_functions:\n            continue\n\n        strings = []\n        for arg in node.args:\n            if isinstance(arg, nodes.Const) and \\\n               isinstance(arg.value, string_types):\n                strings.append(arg.value)\n            else:\n                strings.append(None)\n\n        for arg in node.kwargs:\n            strings.append(None)\n        if node.dyn_args is not None:\n            strings.append(None)\n        if node.dyn_kwargs is not None:\n            strings.append(None)\n\n        if not babel_style:\n            strings = tuple(x for x in strings if x is not None)\n            if not strings:\n                continue\n        else:\n            if len(strings) == 1:\n                strings = strings[0]\n            else:\n                strings = tuple(strings)\n        yield node.lineno, node.node.name, strings\n\n\nclass _CommentFinder(object):\n    \"\"\"Helper class to find comments in a token stream.  Can only\n    find comments for gettext calls forwards.  Once the comment\n    from line 4 is found, a comment for line 1 will not return a\n    usable value.\n    \"\"\"\n\n    def __init__(self, tokens, comment_tags):\n        self.tokens = tokens\n        self.comment_tags = comment_tags\n        self.offset = 0\n        self.last_lineno = 0\n\n    def find_backwards(self, offset):\n        try:\n            for _, token_type, token_value in \\\n                    reversed(self.tokens[self.offset:offset]):\n                if token_type in ('comment', 'linecomment'):\n                    try:\n                        prefix, comment = token_value.split(None, 1)\n                    except ValueError:\n                        continue\n                    if prefix in self.comment_tags:\n                        return [comment.rstrip()]\n            return []\n        finally:\n            self.offset = offset\n\n    def find_comments(self, lineno):\n        if not self.comment_tags or self.last_lineno > lineno:\n            return []\n        for idx, (token_lineno, _, _) in enumerate(self.tokens[self.offset:]):\n            if token_lineno > lineno:\n                return self.find_backwards(self.offset + idx)\n        return self.find_backwards(len(self.tokens))\n\n\ndef babel_extract(fileobj, keywords, comment_tags, options):\n    \"\"\"Babel extraction method for Jinja templates.\n\n    .. versionchanged:: 2.3\n       Basic support for translation comments was added.  If `comment_tags`\n       is now set to a list of keywords for extraction, the extractor will\n       try to find the best preceeding comment that begins with one of the\n       keywords.  For best results, make sure to not have more than one\n       gettext call in one line of code and the matching comment in the\n       same line or the line before.\n\n    .. versionchanged:: 2.5.1\n       The `newstyle_gettext` flag can be set to `True` to enable newstyle\n       gettext calls.\n\n    .. versionchanged:: 2.7\n       A `silent` option can now be provided.  If set to `False` template\n       syntax errors are propagated instead of being ignored.\n\n    :param fileobj: the file-like object the messages should be extracted from\n    :param keywords: a list of keywords (i.e. function names) that should be\n                     recognized as translation functions\n    :param comment_tags: a list of translator tags to search for and include\n                         in the results.\n    :param options: a dictionary of additional options (optional)\n    :return: an iterator over ``(lineno, funcname, message, comments)`` tuples.\n             (comments will be empty currently)\n    \"\"\"\n    extensions = set()\n    for extension in options.get('extensions', '').split(','):\n        extension = extension.strip()\n        if not extension:\n            continue\n        extensions.add(import_string(extension))\n    if InternationalizationExtension not in extensions:\n        extensions.add(InternationalizationExtension)\n\n    def getbool(options, key, default=False):\n        return options.get(key, str(default)).lower() in \\\n            ('1', 'on', 'yes', 'true')\n\n    silent = getbool(options, 'silent', True)\n    environment = Environment(\n        options.get('block_start_string', BLOCK_START_STRING),\n        options.get('block_end_string', BLOCK_END_STRING),\n        options.get('variable_start_string', VARIABLE_START_STRING),\n        options.get('variable_end_string', VARIABLE_END_STRING),\n        options.get('comment_start_string', COMMENT_START_STRING),\n        options.get('comment_end_string', COMMENT_END_STRING),\n        options.get('line_statement_prefix') or LINE_STATEMENT_PREFIX,\n        options.get('line_comment_prefix') or LINE_COMMENT_PREFIX,\n        getbool(options, 'trim_blocks', TRIM_BLOCKS),\n        getbool(options, 'lstrip_blocks', LSTRIP_BLOCKS),\n        NEWLINE_SEQUENCE,\n        getbool(options, 'keep_trailing_newline', KEEP_TRAILING_NEWLINE),\n        frozenset(extensions),\n        cache_size=0,\n        auto_reload=False\n    )\n\n    if getbool(options, 'newstyle_gettext'):\n        environment.newstyle_gettext = True\n\n    source = fileobj.read().decode(options.get('encoding', 'utf-8'))\n    try:\n        node = environment.parse(source)\n        tokens = list(environment.lex(environment.preprocess(source)))\n    except TemplateSyntaxError as e:\n        if not silent:\n            raise\n        # skip templates with syntax errors\n        return\n\n    finder = _CommentFinder(tokens, comment_tags)\n    for lineno, func, message in extract_from_ast(node, keywords):\n        yield lineno, func, message, finder.find_comments(lineno)\n\n\n#: nicer import names\ni18n = InternationalizationExtension\ndo = ExprStmtExtension\nloopcontrols = LoopControlExtension\nwith_ = WithExtension\nautoescape = AutoEscapeExtension\n"
  },
  {
    "path": "lib/jinja2/filters.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    jinja2.filters\n    ~~~~~~~~~~~~~~\n\n    Bundled jinja filters.\n\n    :copyright: (c) 2010 by the Jinja Team.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nimport re\nimport math\n\nfrom random import choice\nfrom operator import itemgetter\nfrom itertools import groupby\nfrom jinja2.utils import Markup, escape, pformat, urlize, soft_unicode, \\\n     unicode_urlencode\nfrom jinja2.runtime import Undefined\nfrom jinja2.exceptions import FilterArgumentError\nfrom jinja2._compat import imap, string_types, text_type, iteritems\n\n\n_word_re = re.compile(r'\\w+(?u)')\n\n\ndef contextfilter(f):\n    \"\"\"Decorator for marking context dependent filters. The current\n    :class:`Context` will be passed as first argument.\n    \"\"\"\n    f.contextfilter = True\n    return f\n\n\ndef evalcontextfilter(f):\n    \"\"\"Decorator for marking eval-context dependent filters.  An eval\n    context object is passed as first argument.  For more information\n    about the eval context, see :ref:`eval-context`.\n\n    .. versionadded:: 2.4\n    \"\"\"\n    f.evalcontextfilter = True\n    return f\n\n\ndef environmentfilter(f):\n    \"\"\"Decorator for marking evironment dependent filters.  The current\n    :class:`Environment` is passed to the filter as first argument.\n    \"\"\"\n    f.environmentfilter = True\n    return f\n\n\ndef make_attrgetter(environment, attribute):\n    \"\"\"Returns a callable that looks up the given attribute from a\n    passed object with the rules of the environment.  Dots are allowed\n    to access attributes of attributes.  Integer parts in paths are\n    looked up as integers.\n    \"\"\"\n    if not isinstance(attribute, string_types) \\\n       or ('.' not in attribute and not attribute.isdigit()):\n        return lambda x: environment.getitem(x, attribute)\n    attribute = attribute.split('.')\n    def attrgetter(item):\n        for part in attribute:\n            if part.isdigit():\n                part = int(part)\n            item = environment.getitem(item, part)\n        return item\n    return attrgetter\n\n\ndef do_forceescape(value):\n    \"\"\"Enforce HTML escaping.  This will probably double escape variables.\"\"\"\n    if hasattr(value, '__html__'):\n        value = value.__html__()\n    return escape(text_type(value))\n\n\ndef do_urlencode(value):\n    \"\"\"Escape strings for use in URLs (uses UTF-8 encoding).  It accepts both\n    dictionaries and regular strings as well as pairwise iterables.\n\n    .. versionadded:: 2.7\n    \"\"\"\n    itemiter = None\n    if isinstance(value, dict):\n        itemiter = iteritems(value)\n    elif not isinstance(value, string_types):\n        try:\n            itemiter = iter(value)\n        except TypeError:\n            pass\n    if itemiter is None:\n        return unicode_urlencode(value)\n    return u'&'.join(unicode_urlencode(k) + '=' +\n                     unicode_urlencode(v, for_qs=True)\n                     for k, v in itemiter)\n\n\n@evalcontextfilter\ndef do_replace(eval_ctx, s, old, new, count=None):\n    \"\"\"Return a copy of the value with all occurrences of a substring\n    replaced with a new one. The first argument is the substring\n    that should be replaced, the second is the replacement string.\n    If the optional third argument ``count`` is given, only the first\n    ``count`` occurrences are replaced:\n\n    .. sourcecode:: jinja\n\n        {{ \"Hello World\"|replace(\"Hello\", \"Goodbye\") }}\n            -> Goodbye World\n\n        {{ \"aaaaargh\"|replace(\"a\", \"d'oh, \", 2) }}\n            -> d'oh, d'oh, aaargh\n    \"\"\"\n    if count is None:\n        count = -1\n    if not eval_ctx.autoescape:\n        return text_type(s).replace(text_type(old), text_type(new), count)\n    if hasattr(old, '__html__') or hasattr(new, '__html__') and \\\n       not hasattr(s, '__html__'):\n        s = escape(s)\n    else:\n        s = soft_unicode(s)\n    return s.replace(soft_unicode(old), soft_unicode(new), count)\n\n\ndef do_upper(s):\n    \"\"\"Convert a value to uppercase.\"\"\"\n    return soft_unicode(s).upper()\n\n\ndef do_lower(s):\n    \"\"\"Convert a value to lowercase.\"\"\"\n    return soft_unicode(s).lower()\n\n\n@evalcontextfilter\ndef do_xmlattr(_eval_ctx, d, autospace=True):\n    \"\"\"Create an SGML/XML attribute string based on the items in a dict.\n    All values that are neither `none` nor `undefined` are automatically\n    escaped:\n\n    .. sourcecode:: html+jinja\n\n        <ul{{ {'class': 'my_list', 'missing': none,\n                'id': 'list-%d'|format(variable)}|xmlattr }}>\n        ...\n        </ul>\n\n    Results in something like this:\n\n    .. sourcecode:: html\n\n        <ul class=\"my_list\" id=\"list-42\">\n        ...\n        </ul>\n\n    As you can see it automatically prepends a space in front of the item\n    if the filter returned something unless the second parameter is false.\n    \"\"\"\n    rv = u' '.join(\n        u'%s=\"%s\"' % (escape(key), escape(value))\n        for key, value in iteritems(d)\n        if value is not None and not isinstance(value, Undefined)\n    )\n    if autospace and rv:\n        rv = u' ' + rv\n    if _eval_ctx.autoescape:\n        rv = Markup(rv)\n    return rv\n\n\ndef do_capitalize(s):\n    \"\"\"Capitalize a value. The first character will be uppercase, all others\n    lowercase.\n    \"\"\"\n    return soft_unicode(s).capitalize()\n\n\ndef do_title(s):\n    \"\"\"Return a titlecased version of the value. I.e. words will start with\n    uppercase letters, all remaining characters are lowercase.\n    \"\"\"\n    rv = []\n    for item in re.compile(r'([-\\s]+)(?u)').split(soft_unicode(s)):\n        if not item:\n            continue\n        rv.append(item[0].upper() + item[1:].lower())\n    return ''.join(rv)\n\n\ndef do_dictsort(value, case_sensitive=False, by='key'):\n    \"\"\"Sort a dict and yield (key, value) pairs. Because python dicts are\n    unsorted you may want to use this function to order them by either\n    key or value:\n\n    .. sourcecode:: jinja\n\n        {% for item in mydict|dictsort %}\n            sort the dict by key, case insensitive\n\n        {% for item in mydict|dictsort(true) %}\n            sort the dict by key, case sensitive\n\n        {% for item in mydict|dictsort(false, 'value') %}\n            sort the dict by value, case insensitive\n    \"\"\"\n    if by == 'key':\n        pos = 0\n    elif by == 'value':\n        pos = 1\n    else:\n        raise FilterArgumentError('You can only sort by either '\n                                  '\"key\" or \"value\"')\n    def sort_func(item):\n        value = item[pos]\n        if isinstance(value, string_types) and not case_sensitive:\n            value = value.lower()\n        return value\n\n    return sorted(value.items(), key=sort_func)\n\n\n@environmentfilter\ndef do_sort(environment, value, reverse=False, case_sensitive=False,\n            attribute=None):\n    \"\"\"Sort an iterable.  Per default it sorts ascending, if you pass it\n    true as first argument it will reverse the sorting.\n\n    If the iterable is made of strings the third parameter can be used to\n    control the case sensitiveness of the comparison which is disabled by\n    default.\n\n    .. sourcecode:: jinja\n\n        {% for item in iterable|sort %}\n            ...\n        {% endfor %}\n\n    It is also possible to sort by an attribute (for example to sort\n    by the date of an object) by specifying the `attribute` parameter:\n\n    .. sourcecode:: jinja\n\n        {% for item in iterable|sort(attribute='date') %}\n            ...\n        {% endfor %}\n\n    .. versionchanged:: 2.6\n       The `attribute` parameter was added.\n    \"\"\"\n    if not case_sensitive:\n        def sort_func(item):\n            if isinstance(item, string_types):\n                item = item.lower()\n            return item\n    else:\n        sort_func = None\n    if attribute is not None:\n        getter = make_attrgetter(environment, attribute)\n        def sort_func(item, processor=sort_func or (lambda x: x)):\n            return processor(getter(item))\n    return sorted(value, key=sort_func, reverse=reverse)\n\n\ndef do_default(value, default_value=u'', boolean=False):\n    \"\"\"If the value is undefined it will return the passed default value,\n    otherwise the value of the variable:\n\n    .. sourcecode:: jinja\n\n        {{ my_variable|default('my_variable is not defined') }}\n\n    This will output the value of ``my_variable`` if the variable was\n    defined, otherwise ``'my_variable is not defined'``. If you want\n    to use default with variables that evaluate to false you have to\n    set the second parameter to `true`:\n\n    .. sourcecode:: jinja\n\n        {{ ''|default('the string was empty', true) }}\n    \"\"\"\n    if isinstance(value, Undefined) or (boolean and not value):\n        return default_value\n    return value\n\n\n@evalcontextfilter\ndef do_join(eval_ctx, value, d=u'', attribute=None):\n    \"\"\"Return a string which is the concatenation of the strings in the\n    sequence. The separator between elements is an empty string per\n    default, you can define it with the optional parameter:\n\n    .. sourcecode:: jinja\n\n        {{ [1, 2, 3]|join('|') }}\n            -> 1|2|3\n\n        {{ [1, 2, 3]|join }}\n            -> 123\n\n    It is also possible to join certain attributes of an object:\n\n    .. sourcecode:: jinja\n\n        {{ users|join(', ', attribute='username') }}\n\n    .. versionadded:: 2.6\n       The `attribute` parameter was added.\n    \"\"\"\n    if attribute is not None:\n        value = imap(make_attrgetter(eval_ctx.environment, attribute), value)\n\n    # no automatic escaping?  joining is a lot eaiser then\n    if not eval_ctx.autoescape:\n        return text_type(d).join(imap(text_type, value))\n\n    # if the delimiter doesn't have an html representation we check\n    # if any of the items has.  If yes we do a coercion to Markup\n    if not hasattr(d, '__html__'):\n        value = list(value)\n        do_escape = False\n        for idx, item in enumerate(value):\n            if hasattr(item, '__html__'):\n                do_escape = True\n            else:\n                value[idx] = text_type(item)\n        if do_escape:\n            d = escape(d)\n        else:\n            d = text_type(d)\n        return d.join(value)\n\n    # no html involved, to normal joining\n    return soft_unicode(d).join(imap(soft_unicode, value))\n\n\ndef do_center(value, width=80):\n    \"\"\"Centers the value in a field of a given width.\"\"\"\n    return text_type(value).center(width)\n\n\n@environmentfilter\ndef do_first(environment, seq):\n    \"\"\"Return the first item of a sequence.\"\"\"\n    try:\n        return next(iter(seq))\n    except StopIteration:\n        return environment.undefined('No first item, sequence was empty.')\n\n\n@environmentfilter\ndef do_last(environment, seq):\n    \"\"\"Return the last item of a sequence.\"\"\"\n    try:\n        return next(iter(reversed(seq)))\n    except StopIteration:\n        return environment.undefined('No last item, sequence was empty.')\n\n\n@environmentfilter\ndef do_random(environment, seq):\n    \"\"\"Return a random item from the sequence.\"\"\"\n    try:\n        return choice(seq)\n    except IndexError:\n        return environment.undefined('No random item, sequence was empty.')\n\n\ndef do_filesizeformat(value, binary=False):\n    \"\"\"Format the value like a 'human-readable' file size (i.e. 13 kB,\n    4.1 MB, 102 Bytes, etc).  Per default decimal prefixes are used (Mega,\n    Giga, etc.), if the second parameter is set to `True` the binary\n    prefixes are used (Mebi, Gibi).\n    \"\"\"\n    bytes = float(value)\n    base = binary and 1024 or 1000\n    prefixes = [\n        (binary and 'KiB' or 'kB'),\n        (binary and 'MiB' or 'MB'),\n        (binary and 'GiB' or 'GB'),\n        (binary and 'TiB' or 'TB'),\n        (binary and 'PiB' or 'PB'),\n        (binary and 'EiB' or 'EB'),\n        (binary and 'ZiB' or 'ZB'),\n        (binary and 'YiB' or 'YB')\n    ]\n    if bytes == 1:\n        return '1 Byte'\n    elif bytes < base:\n        return '%d Bytes' % bytes\n    else:\n        for i, prefix in enumerate(prefixes):\n            unit = base ** (i + 2)\n            if bytes < unit:\n                return '%.1f %s' % ((base * bytes / unit), prefix)\n        return '%.1f %s' % ((base * bytes / unit), prefix)\n\n\ndef do_pprint(value, verbose=False):\n    \"\"\"Pretty print a variable. Useful for debugging.\n\n    With Jinja 1.2 onwards you can pass it a parameter.  If this parameter\n    is truthy the output will be more verbose (this requires `pretty`)\n    \"\"\"\n    return pformat(value, verbose=verbose)\n\n\n@evalcontextfilter\ndef do_urlize(eval_ctx, value, trim_url_limit=None, nofollow=False,\n              target=None):\n    \"\"\"Converts URLs in plain text into clickable links.\n\n    If you pass the filter an additional integer it will shorten the urls\n    to that number. Also a third argument exists that makes the urls\n    \"nofollow\":\n\n    .. sourcecode:: jinja\n\n        {{ mytext|urlize(40, true) }}\n            links are shortened to 40 chars and defined with rel=\"nofollow\"\n\n    If *target* is specified, the ``target`` attribute will be added to the\n    ``<a>`` tag:\n\n    .. sourcecode:: jinja\n\n       {{ mytext|urlize(40, target='_blank') }}\n\n    .. versionchanged:: 2.8+\n       The *target* parameter was added.\n    \"\"\"\n    rv = urlize(value, trim_url_limit, nofollow, target)\n    if eval_ctx.autoescape:\n        rv = Markup(rv)\n    return rv\n\n\ndef do_indent(s, width=4, indentfirst=False):\n    \"\"\"Return a copy of the passed string, each line indented by\n    4 spaces. The first line is not indented. If you want to\n    change the number of spaces or indent the first line too\n    you can pass additional parameters to the filter:\n\n    .. sourcecode:: jinja\n\n        {{ mytext|indent(2, true) }}\n            indent by two spaces and indent the first line too.\n    \"\"\"\n    indention = u' ' * width\n    rv = (u'\\n' + indention).join(s.splitlines())\n    if indentfirst:\n        rv = indention + rv\n    return rv\n\n\ndef do_truncate(s, length=255, killwords=False, end='...'):\n    \"\"\"Return a truncated copy of the string. The length is specified\n    with the first parameter which defaults to ``255``. If the second\n    parameter is ``true`` the filter will cut the text at length. Otherwise\n    it will discard the last word. If the text was in fact\n    truncated it will append an ellipsis sign (``\"...\"``). If you want a\n    different ellipsis sign than ``\"...\"`` you can specify it using the\n    third parameter.\n\n    .. sourcecode:: jinja\n\n        {{ \"foo bar baz\"|truncate(9) }}\n            -> \"foo ...\"\n        {{ \"foo bar baz\"|truncate(9, True) }}\n            -> \"foo ba...\"\n\n    \"\"\"\n    if len(s) <= length:\n        return s\n    elif killwords:\n        return s[:length - len(end)] + end\n\n    result = s[:length - len(end)].rsplit(' ', 1)[0]\n    if len(result) < length:\n        result += ' '\n    return result + end\n\n\n@environmentfilter\ndef do_wordwrap(environment, s, width=79, break_long_words=True,\n                wrapstring=None):\n    \"\"\"\n    Return a copy of the string passed to the filter wrapped after\n    ``79`` characters.  You can override this default using the first\n    parameter.  If you set the second parameter to `false` Jinja will not\n    split words apart if they are longer than `width`. By default, the newlines\n    will be the default newlines for the environment, but this can be changed\n    using the wrapstring keyword argument.\n\n    .. versionadded:: 2.7\n       Added support for the `wrapstring` parameter.\n    \"\"\"\n    if not wrapstring:\n        wrapstring = environment.newline_sequence\n    import textwrap\n    return wrapstring.join(textwrap.wrap(s, width=width, expand_tabs=False,\n                                   replace_whitespace=False,\n                                   break_long_words=break_long_words))\n\n\ndef do_wordcount(s):\n    \"\"\"Count the words in that string.\"\"\"\n    return len(_word_re.findall(s))\n\n\ndef do_int(value, default=0, base=10):\n    \"\"\"Convert the value into an integer. If the\n    conversion doesn't work it will return ``0``. You can\n    override this default using the first parameter. You\n    can also override the default base (10) in the second\n    parameter, which handles input with prefixes such as\n    0b, 0o and 0x for bases 2, 8 and 16 respectively.\n    \"\"\"\n    try:\n        return int(value, base)\n    except (TypeError, ValueError):\n        # this quirk is necessary so that \"42.23\"|int gives 42.\n        try:\n            return int(float(value))\n        except (TypeError, ValueError):\n            return default\n\n\ndef do_float(value, default=0.0):\n    \"\"\"Convert the value into a floating point number. If the\n    conversion doesn't work it will return ``0.0``. You can\n    override this default using the first parameter.\n    \"\"\"\n    try:\n        return float(value)\n    except (TypeError, ValueError):\n        return default\n\n\ndef do_format(value, *args, **kwargs):\n    \"\"\"\n    Apply python string formatting on an object:\n\n    .. sourcecode:: jinja\n\n        {{ \"%s - %s\"|format(\"Hello?\", \"Foo!\") }}\n            -> Hello? - Foo!\n    \"\"\"\n    if args and kwargs:\n        raise FilterArgumentError('can\\'t handle positional and keyword '\n                                  'arguments at the same time')\n    return soft_unicode(value) % (kwargs or args)\n\n\ndef do_trim(value):\n    \"\"\"Strip leading and trailing whitespace.\"\"\"\n    return soft_unicode(value).strip()\n\n\ndef do_striptags(value):\n    \"\"\"Strip SGML/XML tags and replace adjacent whitespace by one space.\n    \"\"\"\n    if hasattr(value, '__html__'):\n        value = value.__html__()\n    return Markup(text_type(value)).striptags()\n\n\ndef do_slice(value, slices, fill_with=None):\n    \"\"\"Slice an iterator and return a list of lists containing\n    those items. Useful if you want to create a div containing\n    three ul tags that represent columns:\n\n    .. sourcecode:: html+jinja\n\n        <div class=\"columwrapper\">\n          {%- for column in items|slice(3) %}\n            <ul class=\"column-{{ loop.index }}\">\n            {%- for item in column %}\n              <li>{{ item }}</li>\n            {%- endfor %}\n            </ul>\n          {%- endfor %}\n        </div>\n\n    If you pass it a second argument it's used to fill missing\n    values on the last iteration.\n    \"\"\"\n    seq = list(value)\n    length = len(seq)\n    items_per_slice = length // slices\n    slices_with_extra = length % slices\n    offset = 0\n    for slice_number in range(slices):\n        start = offset + slice_number * items_per_slice\n        if slice_number < slices_with_extra:\n            offset += 1\n        end = offset + (slice_number + 1) * items_per_slice\n        tmp = seq[start:end]\n        if fill_with is not None and slice_number >= slices_with_extra:\n            tmp.append(fill_with)\n        yield tmp\n\n\ndef do_batch(value, linecount, fill_with=None):\n    \"\"\"\n    A filter that batches items. It works pretty much like `slice`\n    just the other way round. It returns a list of lists with the\n    given number of items. If you provide a second parameter this\n    is used to fill up missing items. See this example:\n\n    .. sourcecode:: html+jinja\n\n        <table>\n        {%- for row in items|batch(3, '&nbsp;') %}\n          <tr>\n          {%- for column in row %}\n            <td>{{ column }}</td>\n          {%- endfor %}\n          </tr>\n        {%- endfor %}\n        </table>\n    \"\"\"\n    tmp = []\n    for item in value:\n        if len(tmp) == linecount:\n            yield tmp\n            tmp = []\n        tmp.append(item)\n    if tmp:\n        if fill_with is not None and len(tmp) < linecount:\n            tmp += [fill_with] * (linecount - len(tmp))\n        yield tmp\n\n\ndef do_round(value, precision=0, method='common'):\n    \"\"\"Round the number to a given precision. The first\n    parameter specifies the precision (default is ``0``), the\n    second the rounding method:\n\n    - ``'common'`` rounds either up or down\n    - ``'ceil'`` always rounds up\n    - ``'floor'`` always rounds down\n\n    If you don't specify a method ``'common'`` is used.\n\n    .. sourcecode:: jinja\n\n        {{ 42.55|round }}\n            -> 43.0\n        {{ 42.55|round(1, 'floor') }}\n            -> 42.5\n\n    Note that even if rounded to 0 precision, a float is returned.  If\n    you need a real integer, pipe it through `int`:\n\n    .. sourcecode:: jinja\n\n        {{ 42.55|round|int }}\n            -> 43\n    \"\"\"\n    if not method in ('common', 'ceil', 'floor'):\n        raise FilterArgumentError('method must be common, ceil or floor')\n    if method == 'common':\n        return round(value, precision)\n    func = getattr(math, method)\n    return func(value * (10 ** precision)) / (10 ** precision)\n\n\n@environmentfilter\ndef do_groupby(environment, value, attribute):\n    \"\"\"Group a sequence of objects by a common attribute.\n\n    If you for example have a list of dicts or objects that represent persons\n    with `gender`, `first_name` and `last_name` attributes and you want to\n    group all users by genders you can do something like the following\n    snippet:\n\n    .. sourcecode:: html+jinja\n\n        <ul>\n        {% for group in persons|groupby('gender') %}\n            <li>{{ group.grouper }}<ul>\n            {% for person in group.list %}\n                <li>{{ person.first_name }} {{ person.last_name }}</li>\n            {% endfor %}</ul></li>\n        {% endfor %}\n        </ul>\n\n    Additionally it's possible to use tuple unpacking for the grouper and\n    list:\n\n    .. sourcecode:: html+jinja\n\n        <ul>\n        {% for grouper, list in persons|groupby('gender') %}\n            ...\n        {% endfor %}\n        </ul>\n\n    As you can see the item we're grouping by is stored in the `grouper`\n    attribute and the `list` contains all the objects that have this grouper\n    in common.\n\n    .. versionchanged:: 2.6\n       It's now possible to use dotted notation to group by the child\n       attribute of another attribute.\n    \"\"\"\n    expr = make_attrgetter(environment, attribute)\n    return sorted(map(_GroupTuple, groupby(sorted(value, key=expr), expr)))\n\n\nclass _GroupTuple(tuple):\n    __slots__ = ()\n    grouper = property(itemgetter(0))\n    list = property(itemgetter(1))\n\n    def __new__(cls, xxx_todo_changeme):\n        (key, value) = xxx_todo_changeme\n        return tuple.__new__(cls, (key, list(value)))\n\n\n@environmentfilter\ndef do_sum(environment, iterable, attribute=None, start=0):\n    \"\"\"Returns the sum of a sequence of numbers plus the value of parameter\n    'start' (which defaults to 0).  When the sequence is empty it returns\n    start.\n\n    It is also possible to sum up only certain attributes:\n\n    .. sourcecode:: jinja\n\n        Total: {{ items|sum(attribute='price') }}\n\n    .. versionchanged:: 2.6\n       The `attribute` parameter was added to allow suming up over\n       attributes.  Also the `start` parameter was moved on to the right.\n    \"\"\"\n    if attribute is not None:\n        iterable = imap(make_attrgetter(environment, attribute), iterable)\n    return sum(iterable, start)\n\n\ndef do_list(value):\n    \"\"\"Convert the value into a list.  If it was a string the returned list\n    will be a list of characters.\n    \"\"\"\n    return list(value)\n\n\ndef do_mark_safe(value):\n    \"\"\"Mark the value as safe which means that in an environment with automatic\n    escaping enabled this variable will not be escaped.\n    \"\"\"\n    return Markup(value)\n\n\ndef do_mark_unsafe(value):\n    \"\"\"Mark a value as unsafe.  This is the reverse operation for :func:`safe`.\"\"\"\n    return text_type(value)\n\n\ndef do_reverse(value):\n    \"\"\"Reverse the object or return an iterator that iterates over it the other\n    way round.\n    \"\"\"\n    if isinstance(value, string_types):\n        return value[::-1]\n    try:\n        return reversed(value)\n    except TypeError:\n        try:\n            rv = list(value)\n            rv.reverse()\n            return rv\n        except TypeError:\n            raise FilterArgumentError('argument must be iterable')\n\n\n@environmentfilter\ndef do_attr(environment, obj, name):\n    \"\"\"Get an attribute of an object.  ``foo|attr(\"bar\")`` works like\n    ``foo.bar`` just that always an attribute is returned and items are not\n    looked up.\n\n    See :ref:`Notes on subscriptions <notes-on-subscriptions>` for more details.\n    \"\"\"\n    try:\n        name = str(name)\n    except UnicodeError:\n        pass\n    else:\n        try:\n            value = getattr(obj, name)\n        except AttributeError:\n            pass\n        else:\n            if environment.sandboxed and not \\\n               environment.is_safe_attribute(obj, name, value):\n                return environment.unsafe_undefined(obj, name)\n            return value\n    return environment.undefined(obj=obj, name=name)\n\n\n@contextfilter\ndef do_map(*args, **kwargs):\n    \"\"\"Applies a filter on a sequence of objects or looks up an attribute.\n    This is useful when dealing with lists of objects but you are really\n    only interested in a certain value of it.\n\n    The basic usage is mapping on an attribute.  Imagine you have a list\n    of users but you are only interested in a list of usernames:\n\n    .. sourcecode:: jinja\n\n        Users on this page: {{ users|map(attribute='username')|join(', ') }}\n\n    Alternatively you can let it invoke a filter by passing the name of the\n    filter and the arguments afterwards.  A good example would be applying a\n    text conversion filter on a sequence:\n\n    .. sourcecode:: jinja\n\n        Users on this page: {{ titles|map('lower')|join(', ') }}\n\n    .. versionadded:: 2.7\n    \"\"\"\n    context = args[0]\n    seq = args[1]\n\n    if len(args) == 2 and 'attribute' in kwargs:\n        attribute = kwargs.pop('attribute')\n        if kwargs:\n            raise FilterArgumentError('Unexpected keyword argument %r' %\n                next(iter(kwargs)))\n        func = make_attrgetter(context.environment, attribute)\n    else:\n        try:\n            name = args[2]\n            args = args[3:]\n        except LookupError:\n            raise FilterArgumentError('map requires a filter argument')\n        func = lambda item: context.environment.call_filter(\n            name, item, args, kwargs, context=context)\n\n    if seq:\n        for item in seq:\n            yield func(item)\n\n\n@contextfilter\ndef do_select(*args, **kwargs):\n    \"\"\"Filters a sequence of objects by applying a test to the object and only\n    selecting the ones with the test succeeding.\n\n    Example usage:\n\n    .. sourcecode:: jinja\n\n        {{ numbers|select(\"odd\") }}\n        {{ numbers|select(\"odd\") }}\n\n    .. versionadded:: 2.7\n    \"\"\"\n    return _select_or_reject(args, kwargs, lambda x: x, False)\n\n\n@contextfilter\ndef do_reject(*args, **kwargs):\n    \"\"\"Filters a sequence of objects by applying a test to the object and\n    rejecting the ones with the test succeeding.\n\n    Example usage:\n\n    .. sourcecode:: jinja\n\n        {{ numbers|reject(\"odd\") }}\n\n    .. versionadded:: 2.7\n    \"\"\"\n    return _select_or_reject(args, kwargs, lambda x: not x, False)\n\n\n@contextfilter\ndef do_selectattr(*args, **kwargs):\n    \"\"\"Filters a sequence of objects by applying a test to an attribute of an\n    object and only selecting the ones with the test succeeding.\n\n    Example usage:\n\n    .. sourcecode:: jinja\n\n        {{ users|selectattr(\"is_active\") }}\n        {{ users|selectattr(\"email\", \"none\") }}\n\n    .. versionadded:: 2.7\n    \"\"\"\n    return _select_or_reject(args, kwargs, lambda x: x, True)\n\n\n@contextfilter\ndef do_rejectattr(*args, **kwargs):\n    \"\"\"Filters a sequence of objects by applying a test to an attribute of an\n    object or the attribute and rejecting the ones with the test succeeding.\n\n    .. sourcecode:: jinja\n\n        {{ users|rejectattr(\"is_active\") }}\n        {{ users|rejectattr(\"email\", \"none\") }}\n\n    .. versionadded:: 2.7\n    \"\"\"\n    return _select_or_reject(args, kwargs, lambda x: not x, True)\n\n\ndef _select_or_reject(args, kwargs, modfunc, lookup_attr):\n    context = args[0]\n    seq = args[1]\n    if lookup_attr:\n        try:\n            attr = args[2]\n        except LookupError:\n            raise FilterArgumentError('Missing parameter for attribute name')\n        transfunc = make_attrgetter(context.environment, attr)\n        off = 1\n    else:\n        off = 0\n        transfunc = lambda x: x\n\n    try:\n        name = args[2 + off]\n        args = args[3 + off:]\n        func = lambda item: context.environment.call_test(\n            name, item, args, kwargs)\n    except LookupError:\n        func = bool\n\n    if seq:\n        for item in seq:\n            if modfunc(func(transfunc(item))):\n                yield item\n\n\nFILTERS = {\n    'abs':                  abs,\n    'attr':                 do_attr,\n    'batch':                do_batch,\n    'capitalize':           do_capitalize,\n    'center':               do_center,\n    'count':                len,\n    'd':                    do_default,\n    'default':              do_default,\n    'dictsort':             do_dictsort,\n    'e':                    escape,\n    'escape':               escape,\n    'filesizeformat':       do_filesizeformat,\n    'first':                do_first,\n    'float':                do_float,\n    'forceescape':          do_forceescape,\n    'format':               do_format,\n    'groupby':              do_groupby,\n    'indent':               do_indent,\n    'int':                  do_int,\n    'join':                 do_join,\n    'last':                 do_last,\n    'length':               len,\n    'list':                 do_list,\n    'lower':                do_lower,\n    'map':                  do_map,\n    'pprint':               do_pprint,\n    'random':               do_random,\n    'reject':               do_reject,\n    'rejectattr':           do_rejectattr,\n    'replace':              do_replace,\n    'reverse':              do_reverse,\n    'round':                do_round,\n    'safe':                 do_mark_safe,\n    'select':               do_select,\n    'selectattr':           do_selectattr,\n    'slice':                do_slice,\n    'sort':                 do_sort,\n    'string':               soft_unicode,\n    'striptags':            do_striptags,\n    'sum':                  do_sum,\n    'title':                do_title,\n    'trim':                 do_trim,\n    'truncate':             do_truncate,\n    'upper':                do_upper,\n    'urlencode':            do_urlencode,\n    'urlize':               do_urlize,\n    'wordcount':            do_wordcount,\n    'wordwrap':             do_wordwrap,\n    'xmlattr':              do_xmlattr,\n}\n"
  },
  {
    "path": "lib/jinja2/lexer.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    jinja2.lexer\n    ~~~~~~~~~~~~\n\n    This module implements a Jinja / Python combination lexer. The\n    `Lexer` class provided by this module is used to do some preprocessing\n    for Jinja.\n\n    On the one hand it filters out invalid operators like the bitshift\n    operators we don't allow in templates. On the other hand it separates\n    template code and python code in expressions.\n\n    :copyright: (c) 2010 by the Jinja Team.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nimport re\n\nfrom operator import itemgetter\nfrom collections import deque\nfrom jinja2.exceptions import TemplateSyntaxError\nfrom jinja2.utils import LRUCache\nfrom jinja2._compat import iteritems, implements_iterator, text_type, \\\n     intern, PY2\n\n\n# cache for the lexers. Exists in order to be able to have multiple\n# environments with the same lexer\n_lexer_cache = LRUCache(50)\n\n# static regular expressions\nwhitespace_re = re.compile(r'\\s+', re.U)\nstring_re = re.compile(r\"('([^'\\\\]*(?:\\\\.[^'\\\\]*)*)'\"\n                       r'|\"([^\"\\\\]*(?:\\\\.[^\"\\\\]*)*)\")', re.S)\ninteger_re = re.compile(r'\\d+')\n\n# we use the unicode identifier rule if this python version is able\n# to handle unicode identifiers, otherwise the standard ASCII one.\ntry:\n    compile('föö', '<unknown>', 'eval')\nexcept SyntaxError:\n    name_re = re.compile(r'\\b[a-zA-Z_][a-zA-Z0-9_]*\\b')\nelse:\n    from jinja2 import _stringdefs\n    name_re = re.compile(r'[%s][%s]*' % (_stringdefs.xid_start,\n                                         _stringdefs.xid_continue))\n\nfloat_re = re.compile(r'(?<!\\.)\\d+\\.\\d+')\nnewline_re = re.compile(r'(\\r\\n|\\r|\\n)')\n\n# internal the tokens and keep references to them\nTOKEN_ADD = intern('add')\nTOKEN_ASSIGN = intern('assign')\nTOKEN_COLON = intern('colon')\nTOKEN_COMMA = intern('comma')\nTOKEN_DIV = intern('div')\nTOKEN_DOT = intern('dot')\nTOKEN_EQ = intern('eq')\nTOKEN_FLOORDIV = intern('floordiv')\nTOKEN_GT = intern('gt')\nTOKEN_GTEQ = intern('gteq')\nTOKEN_LBRACE = intern('lbrace')\nTOKEN_LBRACKET = intern('lbracket')\nTOKEN_LPAREN = intern('lparen')\nTOKEN_LT = intern('lt')\nTOKEN_LTEQ = intern('lteq')\nTOKEN_MOD = intern('mod')\nTOKEN_MUL = intern('mul')\nTOKEN_NE = intern('ne')\nTOKEN_PIPE = intern('pipe')\nTOKEN_POW = intern('pow')\nTOKEN_RBRACE = intern('rbrace')\nTOKEN_RBRACKET = intern('rbracket')\nTOKEN_RPAREN = intern('rparen')\nTOKEN_SEMICOLON = intern('semicolon')\nTOKEN_SUB = intern('sub')\nTOKEN_TILDE = intern('tilde')\nTOKEN_WHITESPACE = intern('whitespace')\nTOKEN_FLOAT = intern('float')\nTOKEN_INTEGER = intern('integer')\nTOKEN_NAME = intern('name')\nTOKEN_STRING = intern('string')\nTOKEN_OPERATOR = intern('operator')\nTOKEN_BLOCK_BEGIN = intern('block_begin')\nTOKEN_BLOCK_END = intern('block_end')\nTOKEN_VARIABLE_BEGIN = intern('variable_begin')\nTOKEN_VARIABLE_END = intern('variable_end')\nTOKEN_RAW_BEGIN = intern('raw_begin')\nTOKEN_RAW_END = intern('raw_end')\nTOKEN_COMMENT_BEGIN = intern('comment_begin')\nTOKEN_COMMENT_END = intern('comment_end')\nTOKEN_COMMENT = intern('comment')\nTOKEN_LINESTATEMENT_BEGIN = intern('linestatement_begin')\nTOKEN_LINESTATEMENT_END = intern('linestatement_end')\nTOKEN_LINECOMMENT_BEGIN = intern('linecomment_begin')\nTOKEN_LINECOMMENT_END = intern('linecomment_end')\nTOKEN_LINECOMMENT = intern('linecomment')\nTOKEN_DATA = intern('data')\nTOKEN_INITIAL = intern('initial')\nTOKEN_EOF = intern('eof')\n\n# bind operators to token types\noperators = {\n    '+':            TOKEN_ADD,\n    '-':            TOKEN_SUB,\n    '/':            TOKEN_DIV,\n    '//':           TOKEN_FLOORDIV,\n    '*':            TOKEN_MUL,\n    '%':            TOKEN_MOD,\n    '**':           TOKEN_POW,\n    '~':            TOKEN_TILDE,\n    '[':            TOKEN_LBRACKET,\n    ']':            TOKEN_RBRACKET,\n    '(':            TOKEN_LPAREN,\n    ')':            TOKEN_RPAREN,\n    '{':            TOKEN_LBRACE,\n    '}':            TOKEN_RBRACE,\n    '==':           TOKEN_EQ,\n    '!=':           TOKEN_NE,\n    '>':            TOKEN_GT,\n    '>=':           TOKEN_GTEQ,\n    '<':            TOKEN_LT,\n    '<=':           TOKEN_LTEQ,\n    '=':            TOKEN_ASSIGN,\n    '.':            TOKEN_DOT,\n    ':':            TOKEN_COLON,\n    '|':            TOKEN_PIPE,\n    ',':            TOKEN_COMMA,\n    ';':            TOKEN_SEMICOLON\n}\n\nreverse_operators = dict([(v, k) for k, v in iteritems(operators)])\nassert len(operators) == len(reverse_operators), 'operators dropped'\noperator_re = re.compile('(%s)' % '|'.join(re.escape(x) for x in\n                         sorted(operators, key=lambda x: -len(x))))\n\nignored_tokens = frozenset([TOKEN_COMMENT_BEGIN, TOKEN_COMMENT,\n                            TOKEN_COMMENT_END, TOKEN_WHITESPACE,\n                            TOKEN_LINECOMMENT_BEGIN, TOKEN_LINECOMMENT_END,\n                            TOKEN_LINECOMMENT])\nignore_if_empty = frozenset([TOKEN_WHITESPACE, TOKEN_DATA,\n                             TOKEN_COMMENT, TOKEN_LINECOMMENT])\n\n\ndef _describe_token_type(token_type):\n    if token_type in reverse_operators:\n        return reverse_operators[token_type]\n    return {\n        TOKEN_COMMENT_BEGIN:        'begin of comment',\n        TOKEN_COMMENT_END:          'end of comment',\n        TOKEN_COMMENT:              'comment',\n        TOKEN_LINECOMMENT:          'comment',\n        TOKEN_BLOCK_BEGIN:          'begin of statement block',\n        TOKEN_BLOCK_END:            'end of statement block',\n        TOKEN_VARIABLE_BEGIN:       'begin of print statement',\n        TOKEN_VARIABLE_END:         'end of print statement',\n        TOKEN_LINESTATEMENT_BEGIN:  'begin of line statement',\n        TOKEN_LINESTATEMENT_END:    'end of line statement',\n        TOKEN_DATA:                 'template data / text',\n        TOKEN_EOF:                  'end of template'\n    }.get(token_type, token_type)\n\n\ndef describe_token(token):\n    \"\"\"Returns a description of the token.\"\"\"\n    if token.type == 'name':\n        return token.value\n    return _describe_token_type(token.type)\n\n\ndef describe_token_expr(expr):\n    \"\"\"Like `describe_token` but for token expressions.\"\"\"\n    if ':' in expr:\n        type, value = expr.split(':', 1)\n        if type == 'name':\n            return value\n    else:\n        type = expr\n    return _describe_token_type(type)\n\n\ndef count_newlines(value):\n    \"\"\"Count the number of newline characters in the string.  This is\n    useful for extensions that filter a stream.\n    \"\"\"\n    return len(newline_re.findall(value))\n\n\ndef compile_rules(environment):\n    \"\"\"Compiles all the rules from the environment into a list of rules.\"\"\"\n    e = re.escape\n    rules = [\n        (len(environment.comment_start_string), 'comment',\n         e(environment.comment_start_string)),\n        (len(environment.block_start_string), 'block',\n         e(environment.block_start_string)),\n        (len(environment.variable_start_string), 'variable',\n         e(environment.variable_start_string))\n    ]\n\n    if environment.line_statement_prefix is not None:\n        rules.append((len(environment.line_statement_prefix), 'linestatement',\n                      r'^[ \\t\\v]*' + e(environment.line_statement_prefix)))\n    if environment.line_comment_prefix is not None:\n        rules.append((len(environment.line_comment_prefix), 'linecomment',\n                      r'(?:^|(?<=\\S))[^\\S\\r\\n]*' +\n                      e(environment.line_comment_prefix)))\n\n    return [x[1:] for x in sorted(rules, reverse=True)]\n\n\nclass Failure(object):\n    \"\"\"Class that raises a `TemplateSyntaxError` if called.\n    Used by the `Lexer` to specify known errors.\n    \"\"\"\n\n    def __init__(self, message, cls=TemplateSyntaxError):\n        self.message = message\n        self.error_class = cls\n\n    def __call__(self, lineno, filename):\n        raise self.error_class(self.message, lineno, filename)\n\n\nclass Token(tuple):\n    \"\"\"Token class.\"\"\"\n    __slots__ = ()\n    lineno, type, value = (property(itemgetter(x)) for x in range(3))\n\n    def __new__(cls, lineno, type, value):\n        return tuple.__new__(cls, (lineno, intern(str(type)), value))\n\n    def __str__(self):\n        if self.type in reverse_operators:\n            return reverse_operators[self.type]\n        elif self.type == 'name':\n            return self.value\n        return self.type\n\n    def test(self, expr):\n        \"\"\"Test a token against a token expression.  This can either be a\n        token type or ``'token_type:token_value'``.  This can only test\n        against string values and types.\n        \"\"\"\n        # here we do a regular string equality check as test_any is usually\n        # passed an iterable of not interned strings.\n        if self.type == expr:\n            return True\n        elif ':' in expr:\n            return expr.split(':', 1) == [self.type, self.value]\n        return False\n\n    def test_any(self, *iterable):\n        \"\"\"Test against multiple token expressions.\"\"\"\n        for expr in iterable:\n            if self.test(expr):\n                return True\n        return False\n\n    def __repr__(self):\n        return 'Token(%r, %r, %r)' % (\n            self.lineno,\n            self.type,\n            self.value\n        )\n\n\n@implements_iterator\nclass TokenStreamIterator(object):\n    \"\"\"The iterator for tokenstreams.  Iterate over the stream\n    until the eof token is reached.\n    \"\"\"\n\n    def __init__(self, stream):\n        self.stream = stream\n\n    def __iter__(self):\n        return self\n\n    def __next__(self):\n        token = self.stream.current\n        if token.type is TOKEN_EOF:\n            self.stream.close()\n            raise StopIteration()\n        next(self.stream)\n        return token\n\n\n@implements_iterator\nclass TokenStream(object):\n    \"\"\"A token stream is an iterable that yields :class:`Token`\\s.  The\n    parser however does not iterate over it but calls :meth:`next` to go\n    one token ahead.  The current active token is stored as :attr:`current`.\n    \"\"\"\n\n    def __init__(self, generator, name, filename):\n        self._iter = iter(generator)\n        self._pushed = deque()\n        self.name = name\n        self.filename = filename\n        self.closed = False\n        self.current = Token(1, TOKEN_INITIAL, '')\n        next(self)\n\n    def __iter__(self):\n        return TokenStreamIterator(self)\n\n    def __bool__(self):\n        return bool(self._pushed) or self.current.type is not TOKEN_EOF\n    __nonzero__ = __bool__  # py2\n\n    eos = property(lambda x: not x, doc=\"Are we at the end of the stream?\")\n\n    def push(self, token):\n        \"\"\"Push a token back to the stream.\"\"\"\n        self._pushed.append(token)\n\n    def look(self):\n        \"\"\"Look at the next token.\"\"\"\n        old_token = next(self)\n        result = self.current\n        self.push(result)\n        self.current = old_token\n        return result\n\n    def skip(self, n=1):\n        \"\"\"Got n tokens ahead.\"\"\"\n        for x in range(n):\n            next(self)\n\n    def next_if(self, expr):\n        \"\"\"Perform the token test and return the token if it matched.\n        Otherwise the return value is `None`.\n        \"\"\"\n        if self.current.test(expr):\n            return next(self)\n\n    def skip_if(self, expr):\n        \"\"\"Like :meth:`next_if` but only returns `True` or `False`.\"\"\"\n        return self.next_if(expr) is not None\n\n    def __next__(self):\n        \"\"\"Go one token ahead and return the old one\"\"\"\n        rv = self.current\n        if self._pushed:\n            self.current = self._pushed.popleft()\n        elif self.current.type is not TOKEN_EOF:\n            try:\n                self.current = next(self._iter)\n            except StopIteration:\n                self.close()\n        return rv\n\n    def close(self):\n        \"\"\"Close the stream.\"\"\"\n        self.current = Token(self.current.lineno, TOKEN_EOF, '')\n        self._iter = None\n        self.closed = True\n\n    def expect(self, expr):\n        \"\"\"Expect a given token type and return it.  This accepts the same\n        argument as :meth:`jinja2.lexer.Token.test`.\n        \"\"\"\n        if not self.current.test(expr):\n            expr = describe_token_expr(expr)\n            if self.current.type is TOKEN_EOF:\n                raise TemplateSyntaxError('unexpected end of template, '\n                                          'expected %r.' % expr,\n                                          self.current.lineno,\n                                          self.name, self.filename)\n            raise TemplateSyntaxError(\"expected token %r, got %r\" %\n                                      (expr, describe_token(self.current)),\n                                      self.current.lineno,\n                                      self.name, self.filename)\n        try:\n            return self.current\n        finally:\n            next(self)\n\n\ndef get_lexer(environment):\n    \"\"\"Return a lexer which is probably cached.\"\"\"\n    key = (environment.block_start_string,\n           environment.block_end_string,\n           environment.variable_start_string,\n           environment.variable_end_string,\n           environment.comment_start_string,\n           environment.comment_end_string,\n           environment.line_statement_prefix,\n           environment.line_comment_prefix,\n           environment.trim_blocks,\n           environment.lstrip_blocks,\n           environment.newline_sequence,\n           environment.keep_trailing_newline)\n    lexer = _lexer_cache.get(key)\n    if lexer is None:\n        lexer = Lexer(environment)\n        _lexer_cache[key] = lexer\n    return lexer\n\n\nclass Lexer(object):\n    \"\"\"Class that implements a lexer for a given environment. Automatically\n    created by the environment class, usually you don't have to do that.\n\n    Note that the lexer is not automatically bound to an environment.\n    Multiple environments can share the same lexer.\n    \"\"\"\n\n    def __init__(self, environment):\n        # shortcuts\n        c = lambda x: re.compile(x, re.M | re.S)\n        e = re.escape\n\n        # lexing rules for tags\n        tag_rules = [\n            (whitespace_re, TOKEN_WHITESPACE, None),\n            (float_re, TOKEN_FLOAT, None),\n            (integer_re, TOKEN_INTEGER, None),\n            (name_re, TOKEN_NAME, None),\n            (string_re, TOKEN_STRING, None),\n            (operator_re, TOKEN_OPERATOR, None)\n        ]\n\n        # assemble the root lexing rule. because \"|\" is ungreedy\n        # we have to sort by length so that the lexer continues working\n        # as expected when we have parsing rules like <% for block and\n        # <%= for variables. (if someone wants asp like syntax)\n        # variables are just part of the rules if variable processing\n        # is required.\n        root_tag_rules = compile_rules(environment)\n\n        # block suffix if trimming is enabled\n        block_suffix_re = environment.trim_blocks and '\\\\n?' or ''\n\n        # strip leading spaces if lstrip_blocks is enabled\n        prefix_re = {}\n        if environment.lstrip_blocks:\n            # use '{%+' to manually disable lstrip_blocks behavior\n            no_lstrip_re = e('+')\n            # detect overlap between block and variable or comment strings\n            block_diff = c(r'^%s(.*)' % e(environment.block_start_string))\n            # make sure we don't mistake a block for a variable or a comment\n            m = block_diff.match(environment.comment_start_string)\n            no_lstrip_re += m and r'|%s' % e(m.group(1)) or ''\n            m = block_diff.match(environment.variable_start_string)\n            no_lstrip_re += m and r'|%s' % e(m.group(1)) or ''\n\n            # detect overlap between comment and variable strings\n            comment_diff = c(r'^%s(.*)' % e(environment.comment_start_string))\n            m = comment_diff.match(environment.variable_start_string)\n            no_variable_re = m and r'(?!%s)' % e(m.group(1)) or ''\n\n            lstrip_re = r'^[ \\t]*'\n            block_prefix_re = r'%s%s(?!%s)|%s\\+?' % (\n                    lstrip_re,\n                    e(environment.block_start_string),\n                    no_lstrip_re,\n                    e(environment.block_start_string),\n                    )\n            comment_prefix_re = r'%s%s%s|%s\\+?' % (\n                    lstrip_re,\n                    e(environment.comment_start_string),\n                    no_variable_re,\n                    e(environment.comment_start_string),\n                    )\n            prefix_re['block'] = block_prefix_re\n            prefix_re['comment'] = comment_prefix_re\n        else:\n            block_prefix_re = '%s' % e(environment.block_start_string)\n\n        self.newline_sequence = environment.newline_sequence\n        self.keep_trailing_newline = environment.keep_trailing_newline\n\n        # global lexing rules\n        self.rules = {\n            'root': [\n                # directives\n                (c('(.*?)(?:%s)' % '|'.join(\n                    [r'(?P<raw_begin>(?:\\s*%s\\-|%s)\\s*raw\\s*(?:\\-%s\\s*|%s))' % (\n                        e(environment.block_start_string),\n                        block_prefix_re,\n                        e(environment.block_end_string),\n                        e(environment.block_end_string)\n                    )] + [\n                        r'(?P<%s_begin>\\s*%s\\-|%s)' % (n, r, prefix_re.get(n,r))\n                        for n, r in root_tag_rules\n                    ])), (TOKEN_DATA, '#bygroup'), '#bygroup'),\n                # data\n                (c('.+'), TOKEN_DATA, None)\n            ],\n            # comments\n            TOKEN_COMMENT_BEGIN: [\n                (c(r'(.*?)((?:\\-%s\\s*|%s)%s)' % (\n                    e(environment.comment_end_string),\n                    e(environment.comment_end_string),\n                    block_suffix_re\n                )), (TOKEN_COMMENT, TOKEN_COMMENT_END), '#pop'),\n                (c('(.)'), (Failure('Missing end of comment tag'),), None)\n            ],\n            # blocks\n            TOKEN_BLOCK_BEGIN: [\n                (c('(?:\\-%s\\s*|%s)%s' % (\n                    e(environment.block_end_string),\n                    e(environment.block_end_string),\n                    block_suffix_re\n                )), TOKEN_BLOCK_END, '#pop'),\n            ] + tag_rules,\n            # variables\n            TOKEN_VARIABLE_BEGIN: [\n                (c('\\-%s\\s*|%s' % (\n                    e(environment.variable_end_string),\n                    e(environment.variable_end_string)\n                )), TOKEN_VARIABLE_END, '#pop')\n            ] + tag_rules,\n            # raw block\n            TOKEN_RAW_BEGIN: [\n                (c('(.*?)((?:\\s*%s\\-|%s)\\s*endraw\\s*(?:\\-%s\\s*|%s%s))' % (\n                    e(environment.block_start_string),\n                    block_prefix_re,\n                    e(environment.block_end_string),\n                    e(environment.block_end_string),\n                    block_suffix_re\n                )), (TOKEN_DATA, TOKEN_RAW_END), '#pop'),\n                (c('(.)'), (Failure('Missing end of raw directive'),), None)\n            ],\n            # line statements\n            TOKEN_LINESTATEMENT_BEGIN: [\n                (c(r'\\s*(\\n|$)'), TOKEN_LINESTATEMENT_END, '#pop')\n            ] + tag_rules,\n            # line comments\n            TOKEN_LINECOMMENT_BEGIN: [\n                (c(r'(.*?)()(?=\\n|$)'), (TOKEN_LINECOMMENT,\n                 TOKEN_LINECOMMENT_END), '#pop')\n            ]\n        }\n\n    def _normalize_newlines(self, value):\n        \"\"\"Called for strings and template data to normalize it to unicode.\"\"\"\n        return newline_re.sub(self.newline_sequence, value)\n\n    def tokenize(self, source, name=None, filename=None, state=None):\n        \"\"\"Calls tokeniter + tokenize and wraps it in a token stream.\n        \"\"\"\n        stream = self.tokeniter(source, name, filename, state)\n        return TokenStream(self.wrap(stream, name, filename), name, filename)\n\n    def wrap(self, stream, name=None, filename=None):\n        \"\"\"This is called with the stream as returned by `tokenize` and wraps\n        every token in a :class:`Token` and converts the value.\n        \"\"\"\n        for lineno, token, value in stream:\n            if token in ignored_tokens:\n                continue\n            elif token == 'linestatement_begin':\n                token = 'block_begin'\n            elif token == 'linestatement_end':\n                token = 'block_end'\n            # we are not interested in those tokens in the parser\n            elif token in ('raw_begin', 'raw_end'):\n                continue\n            elif token == 'data':\n                value = self._normalize_newlines(value)\n            elif token == 'keyword':\n                token = value\n            elif token == 'name':\n                value = str(value)\n            elif token == 'string':\n                # try to unescape string\n                try:\n                    value = self._normalize_newlines(value[1:-1]) \\\n                        .encode('ascii', 'backslashreplace') \\\n                        .decode('unicode-escape')\n                except Exception as e:\n                    msg = str(e).split(':')[-1].strip()\n                    raise TemplateSyntaxError(msg, lineno, name, filename)\n                # if we can express it as bytestring (ascii only)\n                # we do that for support of semi broken APIs\n                # as datetime.datetime.strftime.  On python 3 this\n                # call becomes a noop thanks to 2to3\n                if PY2:\n                    try:\n                        value = value.encode('ascii')\n                    except UnicodeError:\n                        pass\n            elif token == 'integer':\n                value = int(value)\n            elif token == 'float':\n                value = float(value)\n            elif token == 'operator':\n                token = operators[value]\n            yield Token(lineno, token, value)\n\n    def tokeniter(self, source, name, filename=None, state=None):\n        \"\"\"This method tokenizes the text and returns the tokens in a\n        generator.  Use this method if you just want to tokenize a template.\n        \"\"\"\n        source = text_type(source)\n        lines = source.splitlines()\n        if self.keep_trailing_newline and source:\n            for newline in ('\\r\\n', '\\r', '\\n'):\n                if source.endswith(newline):\n                    lines.append('')\n                    break\n        source = '\\n'.join(lines)\n        pos = 0\n        lineno = 1\n        stack = ['root']\n        if state is not None and state != 'root':\n            assert state in ('variable', 'block'), 'invalid state'\n            stack.append(state + '_begin')\n        else:\n            state = 'root'\n        statetokens = self.rules[stack[-1]]\n        source_length = len(source)\n\n        balancing_stack = []\n\n        while 1:\n            # tokenizer loop\n            for regex, tokens, new_state in statetokens:\n                m = regex.match(source, pos)\n                # if no match we try again with the next rule\n                if m is None:\n                    continue\n\n                # we only match blocks and variables if braces / parentheses\n                # are balanced. continue parsing with the lower rule which\n                # is the operator rule. do this only if the end tags look\n                # like operators\n                if balancing_stack and \\\n                   tokens in ('variable_end', 'block_end',\n                              'linestatement_end'):\n                    continue\n\n                # tuples support more options\n                if isinstance(tokens, tuple):\n                    for idx, token in enumerate(tokens):\n                        # failure group\n                        if token.__class__ is Failure:\n                            raise token(lineno, filename)\n                        # bygroup is a bit more complex, in that case we\n                        # yield for the current token the first named\n                        # group that matched\n                        elif token == '#bygroup':\n                            for key, value in iteritems(m.groupdict()):\n                                if value is not None:\n                                    yield lineno, key, value\n                                    lineno += value.count('\\n')\n                                    break\n                            else:\n                                raise RuntimeError('%r wanted to resolve '\n                                                   'the token dynamically'\n                                                   ' but no group matched'\n                                                   % regex)\n                        # normal group\n                        else:\n                            data = m.group(idx + 1)\n                            if data or token not in ignore_if_empty:\n                                yield lineno, token, data\n                            lineno += data.count('\\n')\n\n                # strings as token just are yielded as it.\n                else:\n                    data = m.group()\n                    # update brace/parentheses balance\n                    if tokens == 'operator':\n                        if data == '{':\n                            balancing_stack.append('}')\n                        elif data == '(':\n                            balancing_stack.append(')')\n                        elif data == '[':\n                            balancing_stack.append(']')\n                        elif data in ('}', ')', ']'):\n                            if not balancing_stack:\n                                raise TemplateSyntaxError('unexpected \\'%s\\'' %\n                                                          data, lineno, name,\n                                                          filename)\n                            expected_op = balancing_stack.pop()\n                            if expected_op != data:\n                                raise TemplateSyntaxError('unexpected \\'%s\\', '\n                                                          'expected \\'%s\\'' %\n                                                          (data, expected_op),\n                                                          lineno, name,\n                                                          filename)\n                    # yield items\n                    if data or tokens not in ignore_if_empty:\n                        yield lineno, tokens, data\n                    lineno += data.count('\\n')\n\n                # fetch new position into new variable so that we can check\n                # if there is a internal parsing error which would result\n                # in an infinite loop\n                pos2 = m.end()\n\n                # handle state changes\n                if new_state is not None:\n                    # remove the uppermost state\n                    if new_state == '#pop':\n                        stack.pop()\n                    # resolve the new state by group checking\n                    elif new_state == '#bygroup':\n                        for key, value in iteritems(m.groupdict()):\n                            if value is not None:\n                                stack.append(key)\n                                break\n                        else:\n                            raise RuntimeError('%r wanted to resolve the '\n                                               'new state dynamically but'\n                                               ' no group matched' %\n                                               regex)\n                    # direct state name given\n                    else:\n                        stack.append(new_state)\n                    statetokens = self.rules[stack[-1]]\n                # we are still at the same position and no stack change.\n                # this means a loop without break condition, avoid that and\n                # raise error\n                elif pos2 == pos:\n                    raise RuntimeError('%r yielded empty string without '\n                                       'stack change' % regex)\n                # publish new function and start again\n                pos = pos2\n                break\n            # if loop terminated without break we haven't found a single match\n            # either we are at the end of the file or we have a problem\n            else:\n                # end of text\n                if pos >= source_length:\n                    return\n                # something went wrong\n                raise TemplateSyntaxError('unexpected char %r at %d' %\n                                          (source[pos], pos), lineno,\n                                          name, filename)\n"
  },
  {
    "path": "lib/jinja2/loaders.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    jinja2.loaders\n    ~~~~~~~~~~~~~~\n\n    Jinja loader classes.\n\n    :copyright: (c) 2010 by the Jinja Team.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nimport os\nimport sys\nimport weakref\nfrom types import ModuleType\nfrom os import path\nfrom hashlib import sha1\nfrom jinja2.exceptions import TemplateNotFound\nfrom jinja2.utils import open_if_exists, internalcode\nfrom jinja2._compat import string_types, iteritems\n\n\ndef split_template_path(template):\n    \"\"\"Split a path into segments and perform a sanity check.  If it detects\n    '..' in the path it will raise a `TemplateNotFound` error.\n    \"\"\"\n    pieces = []\n    for piece in template.split('/'):\n        if path.sep in piece \\\n           or (path.altsep and path.altsep in piece) or \\\n           piece == path.pardir:\n            raise TemplateNotFound(template)\n        elif piece and piece != '.':\n            pieces.append(piece)\n    return pieces\n\n\nclass BaseLoader(object):\n    \"\"\"Baseclass for all loaders.  Subclass this and override `get_source` to\n    implement a custom loading mechanism.  The environment provides a\n    `get_template` method that calls the loader's `load` method to get the\n    :class:`Template` object.\n\n    A very basic example for a loader that looks up templates on the file\n    system could look like this::\n\n        from jinja2 import BaseLoader, TemplateNotFound\n        from os.path import join, exists, getmtime\n\n        class MyLoader(BaseLoader):\n\n            def __init__(self, path):\n                self.path = path\n\n            def get_source(self, environment, template):\n                path = join(self.path, template)\n                if not exists(path):\n                    raise TemplateNotFound(template)\n                mtime = getmtime(path)\n                with file(path) as f:\n                    source = f.read().decode('utf-8')\n                return source, path, lambda: mtime == getmtime(path)\n    \"\"\"\n\n    #: if set to `False` it indicates that the loader cannot provide access\n    #: to the source of templates.\n    #:\n    #: .. versionadded:: 2.4\n    has_source_access = True\n\n    def get_source(self, environment, template):\n        \"\"\"Get the template source, filename and reload helper for a template.\n        It's passed the environment and template name and has to return a\n        tuple in the form ``(source, filename, uptodate)`` or raise a\n        `TemplateNotFound` error if it can't locate the template.\n\n        The source part of the returned tuple must be the source of the\n        template as unicode string or a ASCII bytestring.  The filename should\n        be the name of the file on the filesystem if it was loaded from there,\n        otherwise `None`.  The filename is used by python for the tracebacks\n        if no loader extension is used.\n\n        The last item in the tuple is the `uptodate` function.  If auto\n        reloading is enabled it's always called to check if the template\n        changed.  No arguments are passed so the function must store the\n        old state somewhere (for example in a closure).  If it returns `False`\n        the template will be reloaded.\n        \"\"\"\n        if not self.has_source_access:\n            raise RuntimeError('%s cannot provide access to the source' %\n                               self.__class__.__name__)\n        raise TemplateNotFound(template)\n\n    def list_templates(self):\n        \"\"\"Iterates over all templates.  If the loader does not support that\n        it should raise a :exc:`TypeError` which is the default behavior.\n        \"\"\"\n        raise TypeError('this loader cannot iterate over all templates')\n\n    @internalcode\n    def load(self, environment, name, globals=None):\n        \"\"\"Loads a template.  This method looks up the template in the cache\n        or loads one by calling :meth:`get_source`.  Subclasses should not\n        override this method as loaders working on collections of other\n        loaders (such as :class:`PrefixLoader` or :class:`ChoiceLoader`)\n        will not call this method but `get_source` directly.\n        \"\"\"\n        code = None\n        if globals is None:\n            globals = {}\n\n        # first we try to get the source for this template together\n        # with the filename and the uptodate function.\n        source, filename, uptodate = self.get_source(environment, name)\n\n        # try to load the code from the bytecode cache if there is a\n        # bytecode cache configured.\n        bcc = environment.bytecode_cache\n        if bcc is not None:\n            bucket = bcc.get_bucket(environment, name, filename, source)\n            code = bucket.code\n\n        # if we don't have code so far (not cached, no longer up to\n        # date) etc. we compile the template\n        if code is None:\n            code = environment.compile(source, name, filename)\n\n        # if the bytecode cache is available and the bucket doesn't\n        # have a code so far, we give the bucket the new code and put\n        # it back to the bytecode cache.\n        if bcc is not None and bucket.code is None:\n            bucket.code = code\n            bcc.set_bucket(bucket)\n\n        return environment.template_class.from_code(environment, code,\n                                                    globals, uptodate)\n\n\nclass FileSystemLoader(BaseLoader):\n    \"\"\"Loads templates from the file system.  This loader can find templates\n    in folders on the file system and is the preferred way to load them.\n\n    The loader takes the path to the templates as string, or if multiple\n    locations are wanted a list of them which is then looked up in the\n    given order::\n\n    >>> loader = FileSystemLoader('/path/to/templates')\n    >>> loader = FileSystemLoader(['/path/to/templates', '/other/path'])\n\n    Per default the template encoding is ``'utf-8'`` which can be changed\n    by setting the `encoding` parameter to something else.\n\n    To follow symbolic links, set the *followlinks* parameter to ``True``::\n\n    >>> loader = FileSystemLoader('/path/to/templates', followlinks=True)\n\n    .. versionchanged:: 2.8+\n       The *followlinks* parameter was added.\n    \"\"\"\n\n    def __init__(self, searchpath, encoding='utf-8', followlinks=False):\n        if isinstance(searchpath, string_types):\n            searchpath = [searchpath]\n        self.searchpath = list(searchpath)\n        self.encoding = encoding\n        self.followlinks = followlinks\n\n    def get_source(self, environment, template):\n        pieces = split_template_path(template)\n        for searchpath in self.searchpath:\n            filename = path.join(searchpath, *pieces)\n            f = open_if_exists(filename)\n            if f is None:\n                continue\n            try:\n                contents = f.read().decode(self.encoding)\n            finally:\n                f.close()\n\n            mtime = path.getmtime(filename)\n\n            def uptodate():\n                try:\n                    return path.getmtime(filename) == mtime\n                except OSError:\n                    return False\n            return contents, filename, uptodate\n        raise TemplateNotFound(template)\n\n    def list_templates(self):\n        found = set()\n        for searchpath in self.searchpath:\n            walk_dir = os.walk(searchpath, followlinks=self.followlinks)\n            for dirpath, dirnames, filenames in walk_dir:\n                for filename in filenames:\n                    template = os.path.join(dirpath, filename) \\\n                        [len(searchpath):].strip(os.path.sep) \\\n                                          .replace(os.path.sep, '/')\n                    if template[:2] == './':\n                        template = template[2:]\n                    if template not in found:\n                        found.add(template)\n        return sorted(found)\n\n\nclass PackageLoader(BaseLoader):\n    \"\"\"Load templates from python eggs or packages.  It is constructed with\n    the name of the python package and the path to the templates in that\n    package::\n\n        loader = PackageLoader('mypackage', 'views')\n\n    If the package path is not given, ``'templates'`` is assumed.\n\n    Per default the template encoding is ``'utf-8'`` which can be changed\n    by setting the `encoding` parameter to something else.  Due to the nature\n    of eggs it's only possible to reload templates if the package was loaded\n    from the file system and not a zip file.\n    \"\"\"\n\n    def __init__(self, package_name, package_path='templates',\n                 encoding='utf-8'):\n        from pkg_resources import DefaultProvider, ResourceManager, \\\n                                  get_provider\n        provider = get_provider(package_name)\n        self.encoding = encoding\n        self.manager = ResourceManager()\n        self.filesystem_bound = isinstance(provider, DefaultProvider)\n        self.provider = provider\n        self.package_path = package_path\n\n    def get_source(self, environment, template):\n        pieces = split_template_path(template)\n        p = '/'.join((self.package_path,) + tuple(pieces))\n        if not self.provider.has_resource(p):\n            raise TemplateNotFound(template)\n\n        filename = uptodate = None\n        if self.filesystem_bound:\n            filename = self.provider.get_resource_filename(self.manager, p)\n            mtime = path.getmtime(filename)\n            def uptodate():\n                try:\n                    return path.getmtime(filename) == mtime\n                except OSError:\n                    return False\n\n        source = self.provider.get_resource_string(self.manager, p)\n        return source.decode(self.encoding), filename, uptodate\n\n    def list_templates(self):\n        path = self.package_path\n        if path[:2] == './':\n            path = path[2:]\n        elif path == '.':\n            path = ''\n        offset = len(path)\n        results = []\n        def _walk(path):\n            for filename in self.provider.resource_listdir(path):\n                fullname = path + '/' + filename\n                if self.provider.resource_isdir(fullname):\n                    _walk(fullname)\n                else:\n                    results.append(fullname[offset:].lstrip('/'))\n        _walk(path)\n        results.sort()\n        return results\n\n\nclass DictLoader(BaseLoader):\n    \"\"\"Loads a template from a python dict.  It's passed a dict of unicode\n    strings bound to template names.  This loader is useful for unittesting:\n\n    >>> loader = DictLoader({'index.html': 'source here'})\n\n    Because auto reloading is rarely useful this is disabled per default.\n    \"\"\"\n\n    def __init__(self, mapping):\n        self.mapping = mapping\n\n    def get_source(self, environment, template):\n        if template in self.mapping:\n            source = self.mapping[template]\n            return source, None, lambda: source == self.mapping.get(template)\n        raise TemplateNotFound(template)\n\n    def list_templates(self):\n        return sorted(self.mapping)\n\n\nclass FunctionLoader(BaseLoader):\n    \"\"\"A loader that is passed a function which does the loading.  The\n    function receives the name of the template and has to return either\n    an unicode string with the template source, a tuple in the form ``(source,\n    filename, uptodatefunc)`` or `None` if the template does not exist.\n\n    >>> def load_template(name):\n    ...     if name == 'index.html':\n    ...         return '...'\n    ...\n    >>> loader = FunctionLoader(load_template)\n\n    The `uptodatefunc` is a function that is called if autoreload is enabled\n    and has to return `True` if the template is still up to date.  For more\n    details have a look at :meth:`BaseLoader.get_source` which has the same\n    return value.\n    \"\"\"\n\n    def __init__(self, load_func):\n        self.load_func = load_func\n\n    def get_source(self, environment, template):\n        rv = self.load_func(template)\n        if rv is None:\n            raise TemplateNotFound(template)\n        elif isinstance(rv, string_types):\n            return rv, None, None\n        return rv\n\n\nclass PrefixLoader(BaseLoader):\n    \"\"\"A loader that is passed a dict of loaders where each loader is bound\n    to a prefix.  The prefix is delimited from the template by a slash per\n    default, which can be changed by setting the `delimiter` argument to\n    something else::\n\n        loader = PrefixLoader({\n            'app1':     PackageLoader('mypackage.app1'),\n            'app2':     PackageLoader('mypackage.app2')\n        })\n\n    By loading ``'app1/index.html'`` the file from the app1 package is loaded,\n    by loading ``'app2/index.html'`` the file from the second.\n    \"\"\"\n\n    def __init__(self, mapping, delimiter='/'):\n        self.mapping = mapping\n        self.delimiter = delimiter\n\n    def get_loader(self, template):\n        try:\n            prefix, name = template.split(self.delimiter, 1)\n            loader = self.mapping[prefix]\n        except (ValueError, KeyError):\n            raise TemplateNotFound(template)\n        return loader, name\n\n    def get_source(self, environment, template):\n        loader, name = self.get_loader(template)\n        try:\n            return loader.get_source(environment, name)\n        except TemplateNotFound:\n            # re-raise the exception with the correct fileame here.\n            # (the one that includes the prefix)\n            raise TemplateNotFound(template)\n\n    @internalcode\n    def load(self, environment, name, globals=None):\n        loader, local_name = self.get_loader(name)\n        try:\n            return loader.load(environment, local_name, globals)\n        except TemplateNotFound:\n            # re-raise the exception with the correct fileame here.\n            # (the one that includes the prefix)\n            raise TemplateNotFound(name)\n\n    def list_templates(self):\n        result = []\n        for prefix, loader in iteritems(self.mapping):\n            for template in loader.list_templates():\n                result.append(prefix + self.delimiter + template)\n        return result\n\n\nclass ChoiceLoader(BaseLoader):\n    \"\"\"This loader works like the `PrefixLoader` just that no prefix is\n    specified.  If a template could not be found by one loader the next one\n    is tried.\n\n    >>> loader = ChoiceLoader([\n    ...     FileSystemLoader('/path/to/user/templates'),\n    ...     FileSystemLoader('/path/to/system/templates')\n    ... ])\n\n    This is useful if you want to allow users to override builtin templates\n    from a different location.\n    \"\"\"\n\n    def __init__(self, loaders):\n        self.loaders = loaders\n\n    def get_source(self, environment, template):\n        for loader in self.loaders:\n            try:\n                return loader.get_source(environment, template)\n            except TemplateNotFound:\n                pass\n        raise TemplateNotFound(template)\n\n    @internalcode\n    def load(self, environment, name, globals=None):\n        for loader in self.loaders:\n            try:\n                return loader.load(environment, name, globals)\n            except TemplateNotFound:\n                pass\n        raise TemplateNotFound(name)\n\n    def list_templates(self):\n        found = set()\n        for loader in self.loaders:\n            found.update(loader.list_templates())\n        return sorted(found)\n\n\nclass _TemplateModule(ModuleType):\n    \"\"\"Like a normal module but with support for weak references\"\"\"\n\n\nclass ModuleLoader(BaseLoader):\n    \"\"\"This loader loads templates from precompiled templates.\n\n    Example usage:\n\n    >>> loader = ChoiceLoader([\n    ...     ModuleLoader('/path/to/compiled/templates'),\n    ...     FileSystemLoader('/path/to/templates')\n    ... ])\n\n    Templates can be precompiled with :meth:`Environment.compile_templates`.\n    \"\"\"\n\n    has_source_access = False\n\n    def __init__(self, path):\n        package_name = '_jinja2_module_templates_%x' % id(self)\n\n        # create a fake module that looks for the templates in the\n        # path given.\n        mod = _TemplateModule(package_name)\n        if isinstance(path, string_types):\n            path = [path]\n        else:\n            path = list(path)\n        mod.__path__ = path\n\n        sys.modules[package_name] = weakref.proxy(mod,\n            lambda x: sys.modules.pop(package_name, None))\n\n        # the only strong reference, the sys.modules entry is weak\n        # so that the garbage collector can remove it once the\n        # loader that created it goes out of business.\n        self.module = mod\n        self.package_name = package_name\n\n    @staticmethod\n    def get_template_key(name):\n        return 'tmpl_' + sha1(name.encode('utf-8')).hexdigest()\n\n    @staticmethod\n    def get_module_filename(name):\n        return ModuleLoader.get_template_key(name) + '.py'\n\n    @internalcode\n    def load(self, environment, name, globals=None):\n        key = self.get_template_key(name)\n        module = '%s.%s' % (self.package_name, key)\n        mod = getattr(self.module, module, None)\n        if mod is None:\n            try:\n                mod = __import__(module, None, None, ['root'])\n            except ImportError:\n                raise TemplateNotFound(name)\n\n            # remove the entry from sys.modules, we only want the attribute\n            # on the module object we have stored on the loader.\n            sys.modules.pop(module, None)\n\n        return environment.template_class.from_module_dict(\n            environment, mod.__dict__, globals)\n"
  },
  {
    "path": "lib/jinja2/meta.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    jinja2.meta\n    ~~~~~~~~~~~\n\n    This module implements various functions that exposes information about\n    templates that might be interesting for various kinds of applications.\n\n    :copyright: (c) 2010 by the Jinja Team, see AUTHORS for more details.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nfrom jinja2 import nodes\nfrom jinja2.compiler import CodeGenerator\nfrom jinja2._compat import string_types\n\n\nclass TrackingCodeGenerator(CodeGenerator):\n    \"\"\"We abuse the code generator for introspection.\"\"\"\n\n    def __init__(self, environment):\n        CodeGenerator.__init__(self, environment, '<introspection>',\n                               '<introspection>')\n        self.undeclared_identifiers = set()\n\n    def write(self, x):\n        \"\"\"Don't write.\"\"\"\n\n    def pull_locals(self, frame):\n        \"\"\"Remember all undeclared identifiers.\"\"\"\n        self.undeclared_identifiers.update(frame.identifiers.undeclared)\n\n\ndef find_undeclared_variables(ast):\n    \"\"\"Returns a set of all variables in the AST that will be looked up from\n    the context at runtime.  Because at compile time it's not known which\n    variables will be used depending on the path the execution takes at\n    runtime, all variables are returned.\n\n    >>> from jinja2 import Environment, meta\n    >>> env = Environment()\n    >>> ast = env.parse('{% set foo = 42 %}{{ bar + foo }}')\n    >>> meta.find_undeclared_variables(ast) == set(['bar'])\n    True\n\n    .. admonition:: Implementation\n\n       Internally the code generator is used for finding undeclared variables.\n       This is good to know because the code generator might raise a\n       :exc:`TemplateAssertionError` during compilation and as a matter of\n       fact this function can currently raise that exception as well.\n    \"\"\"\n    codegen = TrackingCodeGenerator(ast.environment)\n    codegen.visit(ast)\n    return codegen.undeclared_identifiers\n\n\ndef find_referenced_templates(ast):\n    \"\"\"Finds all the referenced templates from the AST.  This will return an\n    iterator over all the hardcoded template extensions, inclusions and\n    imports.  If dynamic inheritance or inclusion is used, `None` will be\n    yielded.\n\n    >>> from jinja2 import Environment, meta\n    >>> env = Environment()\n    >>> ast = env.parse('{% extends \"layout.html\" %}{% include helper %}')\n    >>> list(meta.find_referenced_templates(ast))\n    ['layout.html', None]\n\n    This function is useful for dependency tracking.  For example if you want\n    to rebuild parts of the website after a layout template has changed.\n    \"\"\"\n    for node in ast.find_all((nodes.Extends, nodes.FromImport, nodes.Import,\n                              nodes.Include)):\n        if not isinstance(node.template, nodes.Const):\n            # a tuple with some non consts in there\n            if isinstance(node.template, (nodes.Tuple, nodes.List)):\n                for template_name in node.template.items:\n                    # something const, only yield the strings and ignore\n                    # non-string consts that really just make no sense\n                    if isinstance(template_name, nodes.Const):\n                        if isinstance(template_name.value, string_types):\n                            yield template_name.value\n                    # something dynamic in there\n                    else:\n                        yield None\n            # something dynamic we don't know about here\n            else:\n                yield None\n            continue\n        # constant is a basestring, direct template name\n        if isinstance(node.template.value, string_types):\n            yield node.template.value\n        # a tuple or list (latter *should* not happen) made of consts,\n        # yield the consts that are strings.  We could warn here for\n        # non string values\n        elif isinstance(node, nodes.Include) and \\\n             isinstance(node.template.value, (tuple, list)):\n            for template_name in node.template.value:\n                if isinstance(template_name, string_types):\n                    yield template_name\n        # something else we don't care about, we could warn here\n        else:\n            yield None\n"
  },
  {
    "path": "lib/jinja2/nodes.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    jinja2.nodes\n    ~~~~~~~~~~~~\n\n    This module implements additional nodes derived from the ast base node.\n\n    It also provides some node tree helper functions like `in_lineno` and\n    `get_nodes` used by the parser and translator in order to normalize\n    python and jinja nodes.\n\n    :copyright: (c) 2010 by the Jinja Team.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nimport types\nimport operator\n\nfrom collections import deque\nfrom jinja2.utils import Markup\nfrom jinja2._compat import izip, with_metaclass, text_type\n\n\n#: the types we support for context functions\n_context_function_types = (types.FunctionType, types.MethodType)\n\n\n_binop_to_func = {\n    '*':        operator.mul,\n    '/':        operator.truediv,\n    '//':       operator.floordiv,\n    '**':       operator.pow,\n    '%':        operator.mod,\n    '+':        operator.add,\n    '-':        operator.sub\n}\n\n_uaop_to_func = {\n    'not':      operator.not_,\n    '+':        operator.pos,\n    '-':        operator.neg\n}\n\n_cmpop_to_func = {\n    'eq':       operator.eq,\n    'ne':       operator.ne,\n    'gt':       operator.gt,\n    'gteq':     operator.ge,\n    'lt':       operator.lt,\n    'lteq':     operator.le,\n    'in':       lambda a, b: a in b,\n    'notin':    lambda a, b: a not in b\n}\n\n\nclass Impossible(Exception):\n    \"\"\"Raised if the node could not perform a requested action.\"\"\"\n\n\nclass NodeType(type):\n    \"\"\"A metaclass for nodes that handles the field and attribute\n    inheritance.  fields and attributes from the parent class are\n    automatically forwarded to the child.\"\"\"\n\n    def __new__(cls, name, bases, d):\n        for attr in 'fields', 'attributes':\n            storage = []\n            storage.extend(getattr(bases[0], attr, ()))\n            storage.extend(d.get(attr, ()))\n            assert len(bases) == 1, 'multiple inheritance not allowed'\n            assert len(storage) == len(set(storage)), 'layout conflict'\n            d[attr] = tuple(storage)\n        d.setdefault('abstract', False)\n        return type.__new__(cls, name, bases, d)\n\n\nclass EvalContext(object):\n    \"\"\"Holds evaluation time information.  Custom attributes can be attached\n    to it in extensions.\n    \"\"\"\n\n    def __init__(self, environment, template_name=None):\n        self.environment = environment\n        if callable(environment.autoescape):\n            self.autoescape = environment.autoescape(template_name)\n        else:\n            self.autoescape = environment.autoescape\n        self.volatile = False\n\n    def save(self):\n        return self.__dict__.copy()\n\n    def revert(self, old):\n        self.__dict__.clear()\n        self.__dict__.update(old)\n\n\ndef get_eval_context(node, ctx):\n    if ctx is None:\n        if node.environment is None:\n            raise RuntimeError('if no eval context is passed, the '\n                               'node must have an attached '\n                               'environment.')\n        return EvalContext(node.environment)\n    return ctx\n\n\nclass Node(with_metaclass(NodeType, object)):\n    \"\"\"Baseclass for all Jinja2 nodes.  There are a number of nodes available\n    of different types.  There are four major types:\n\n    -   :class:`Stmt`: statements\n    -   :class:`Expr`: expressions\n    -   :class:`Helper`: helper nodes\n    -   :class:`Template`: the outermost wrapper node\n\n    All nodes have fields and attributes.  Fields may be other nodes, lists,\n    or arbitrary values.  Fields are passed to the constructor as regular\n    positional arguments, attributes as keyword arguments.  Each node has\n    two attributes: `lineno` (the line number of the node) and `environment`.\n    The `environment` attribute is set at the end of the parsing process for\n    all nodes automatically.\n    \"\"\"\n    fields = ()\n    attributes = ('lineno', 'environment')\n    abstract = True\n\n    def __init__(self, *fields, **attributes):\n        if self.abstract:\n            raise TypeError('abstract nodes are not instanciable')\n        if fields:\n            if len(fields) != len(self.fields):\n                if not self.fields:\n                    raise TypeError('%r takes 0 arguments' %\n                                    self.__class__.__name__)\n                raise TypeError('%r takes 0 or %d argument%s' % (\n                    self.__class__.__name__,\n                    len(self.fields),\n                    len(self.fields) != 1 and 's' or ''\n                ))\n            for name, arg in izip(self.fields, fields):\n                setattr(self, name, arg)\n        for attr in self.attributes:\n            setattr(self, attr, attributes.pop(attr, None))\n        if attributes:\n            raise TypeError('unknown attribute %r' %\n                            next(iter(attributes)))\n\n    def iter_fields(self, exclude=None, only=None):\n        \"\"\"This method iterates over all fields that are defined and yields\n        ``(key, value)`` tuples.  Per default all fields are returned, but\n        it's possible to limit that to some fields by providing the `only`\n        parameter or to exclude some using the `exclude` parameter.  Both\n        should be sets or tuples of field names.\n        \"\"\"\n        for name in self.fields:\n            if (exclude is only is None) or \\\n               (exclude is not None and name not in exclude) or \\\n               (only is not None and name in only):\n                try:\n                    yield name, getattr(self, name)\n                except AttributeError:\n                    pass\n\n    def iter_child_nodes(self, exclude=None, only=None):\n        \"\"\"Iterates over all direct child nodes of the node.  This iterates\n        over all fields and yields the values of they are nodes.  If the value\n        of a field is a list all the nodes in that list are returned.\n        \"\"\"\n        for field, item in self.iter_fields(exclude, only):\n            if isinstance(item, list):\n                for n in item:\n                    if isinstance(n, Node):\n                        yield n\n            elif isinstance(item, Node):\n                yield item\n\n    def find(self, node_type):\n        \"\"\"Find the first node of a given type.  If no such node exists the\n        return value is `None`.\n        \"\"\"\n        for result in self.find_all(node_type):\n            return result\n\n    def find_all(self, node_type):\n        \"\"\"Find all the nodes of a given type.  If the type is a tuple,\n        the check is performed for any of the tuple items.\n        \"\"\"\n        for child in self.iter_child_nodes():\n            if isinstance(child, node_type):\n                yield child\n            for result in child.find_all(node_type):\n                yield result\n\n    def set_ctx(self, ctx):\n        \"\"\"Reset the context of a node and all child nodes.  Per default the\n        parser will all generate nodes that have a 'load' context as it's the\n        most common one.  This method is used in the parser to set assignment\n        targets and other nodes to a store context.\n        \"\"\"\n        todo = deque([self])\n        while todo:\n            node = todo.popleft()\n            if 'ctx' in node.fields:\n                node.ctx = ctx\n            todo.extend(node.iter_child_nodes())\n        return self\n\n    def set_lineno(self, lineno, override=False):\n        \"\"\"Set the line numbers of the node and children.\"\"\"\n        todo = deque([self])\n        while todo:\n            node = todo.popleft()\n            if 'lineno' in node.attributes:\n                if node.lineno is None or override:\n                    node.lineno = lineno\n            todo.extend(node.iter_child_nodes())\n        return self\n\n    def set_environment(self, environment):\n        \"\"\"Set the environment for all nodes.\"\"\"\n        todo = deque([self])\n        while todo:\n            node = todo.popleft()\n            node.environment = environment\n            todo.extend(node.iter_child_nodes())\n        return self\n\n    def __eq__(self, other):\n        return type(self) is type(other) and \\\n               tuple(self.iter_fields()) == tuple(other.iter_fields())\n\n    def __ne__(self, other):\n        return not self.__eq__(other)\n\n    # Restore Python 2 hashing behavior on Python 3\n    __hash__ = object.__hash__\n\n    def __repr__(self):\n        return '%s(%s)' % (\n            self.__class__.__name__,\n            ', '.join('%s=%r' % (arg, getattr(self, arg, None)) for\n                      arg in self.fields)\n        )\n\n\nclass Stmt(Node):\n    \"\"\"Base node for all statements.\"\"\"\n    abstract = True\n\n\nclass Helper(Node):\n    \"\"\"Nodes that exist in a specific context only.\"\"\"\n    abstract = True\n\n\nclass Template(Node):\n    \"\"\"Node that represents a template.  This must be the outermost node that\n    is passed to the compiler.\n    \"\"\"\n    fields = ('body',)\n\n\nclass Output(Stmt):\n    \"\"\"A node that holds multiple expressions which are then printed out.\n    This is used both for the `print` statement and the regular template data.\n    \"\"\"\n    fields = ('nodes',)\n\n\nclass Extends(Stmt):\n    \"\"\"Represents an extends statement.\"\"\"\n    fields = ('template',)\n\n\nclass For(Stmt):\n    \"\"\"The for loop.  `target` is the target for the iteration (usually a\n    :class:`Name` or :class:`Tuple`), `iter` the iterable.  `body` is a list\n    of nodes that are used as loop-body, and `else_` a list of nodes for the\n    `else` block.  If no else node exists it has to be an empty list.\n\n    For filtered nodes an expression can be stored as `test`, otherwise `None`.\n    \"\"\"\n    fields = ('target', 'iter', 'body', 'else_', 'test', 'recursive')\n\n\nclass If(Stmt):\n    \"\"\"If `test` is true, `body` is rendered, else `else_`.\"\"\"\n    fields = ('test', 'body', 'else_')\n\n\nclass Macro(Stmt):\n    \"\"\"A macro definition.  `name` is the name of the macro, `args` a list of\n    arguments and `defaults` a list of defaults if there are any.  `body` is\n    a list of nodes for the macro body.\n    \"\"\"\n    fields = ('name', 'args', 'defaults', 'body')\n\n\nclass CallBlock(Stmt):\n    \"\"\"Like a macro without a name but a call instead.  `call` is called with\n    the unnamed macro as `caller` argument this node holds.\n    \"\"\"\n    fields = ('call', 'args', 'defaults', 'body')\n\n\nclass FilterBlock(Stmt):\n    \"\"\"Node for filter sections.\"\"\"\n    fields = ('body', 'filter')\n\n\nclass Block(Stmt):\n    \"\"\"A node that represents a block.\"\"\"\n    fields = ('name', 'body', 'scoped')\n\n\nclass Include(Stmt):\n    \"\"\"A node that represents the include tag.\"\"\"\n    fields = ('template', 'with_context', 'ignore_missing')\n\n\nclass Import(Stmt):\n    \"\"\"A node that represents the import tag.\"\"\"\n    fields = ('template', 'target', 'with_context')\n\n\nclass FromImport(Stmt):\n    \"\"\"A node that represents the from import tag.  It's important to not\n    pass unsafe names to the name attribute.  The compiler translates the\n    attribute lookups directly into getattr calls and does *not* use the\n    subscript callback of the interface.  As exported variables may not\n    start with double underscores (which the parser asserts) this is not a\n    problem for regular Jinja code, but if this node is used in an extension\n    extra care must be taken.\n\n    The list of names may contain tuples if aliases are wanted.\n    \"\"\"\n    fields = ('template', 'names', 'with_context')\n\n\nclass ExprStmt(Stmt):\n    \"\"\"A statement that evaluates an expression and discards the result.\"\"\"\n    fields = ('node',)\n\n\nclass Assign(Stmt):\n    \"\"\"Assigns an expression to a target.\"\"\"\n    fields = ('target', 'node')\n\n\nclass AssignBlock(Stmt):\n    \"\"\"Assigns a block to a target.\"\"\"\n    fields = ('target', 'body')\n\n\nclass Expr(Node):\n    \"\"\"Baseclass for all expressions.\"\"\"\n    abstract = True\n\n    def as_const(self, eval_ctx=None):\n        \"\"\"Return the value of the expression as constant or raise\n        :exc:`Impossible` if this was not possible.\n\n        An :class:`EvalContext` can be provided, if none is given\n        a default context is created which requires the nodes to have\n        an attached environment.\n\n        .. versionchanged:: 2.4\n           the `eval_ctx` parameter was added.\n        \"\"\"\n        raise Impossible()\n\n    def can_assign(self):\n        \"\"\"Check if it's possible to assign something to this node.\"\"\"\n        return False\n\n\nclass BinExpr(Expr):\n    \"\"\"Baseclass for all binary expressions.\"\"\"\n    fields = ('left', 'right')\n    operator = None\n    abstract = True\n\n    def as_const(self, eval_ctx=None):\n        eval_ctx = get_eval_context(self, eval_ctx)\n        # intercepted operators cannot be folded at compile time\n        if self.environment.sandboxed and \\\n           self.operator in self.environment.intercepted_binops:\n            raise Impossible()\n        f = _binop_to_func[self.operator]\n        try:\n            return f(self.left.as_const(eval_ctx), self.right.as_const(eval_ctx))\n        except Exception:\n            raise Impossible()\n\n\nclass UnaryExpr(Expr):\n    \"\"\"Baseclass for all unary expressions.\"\"\"\n    fields = ('node',)\n    operator = None\n    abstract = True\n\n    def as_const(self, eval_ctx=None):\n        eval_ctx = get_eval_context(self, eval_ctx)\n        # intercepted operators cannot be folded at compile time\n        if self.environment.sandboxed and \\\n           self.operator in self.environment.intercepted_unops:\n            raise Impossible()\n        f = _uaop_to_func[self.operator]\n        try:\n            return f(self.node.as_const(eval_ctx))\n        except Exception:\n            raise Impossible()\n\n\nclass Name(Expr):\n    \"\"\"Looks up a name or stores a value in a name.\n    The `ctx` of the node can be one of the following values:\n\n    -   `store`: store a value in the name\n    -   `load`: load that name\n    -   `param`: like `store` but if the name was defined as function parameter.\n    \"\"\"\n    fields = ('name', 'ctx')\n\n    def can_assign(self):\n        return self.name not in ('true', 'false', 'none',\n                                 'True', 'False', 'None')\n\n\nclass Literal(Expr):\n    \"\"\"Baseclass for literals.\"\"\"\n    abstract = True\n\n\nclass Const(Literal):\n    \"\"\"All constant values.  The parser will return this node for simple\n    constants such as ``42`` or ``\"foo\"`` but it can be used to store more\n    complex values such as lists too.  Only constants with a safe\n    representation (objects where ``eval(repr(x)) == x`` is true).\n    \"\"\"\n    fields = ('value',)\n\n    def as_const(self, eval_ctx=None):\n        return self.value\n\n    @classmethod\n    def from_untrusted(cls, value, lineno=None, environment=None):\n        \"\"\"Return a const object if the value is representable as\n        constant value in the generated code, otherwise it will raise\n        an `Impossible` exception.\n        \"\"\"\n        from .compiler import has_safe_repr\n        if not has_safe_repr(value):\n            raise Impossible()\n        return cls(value, lineno=lineno, environment=environment)\n\n\nclass TemplateData(Literal):\n    \"\"\"A constant template string.\"\"\"\n    fields = ('data',)\n\n    def as_const(self, eval_ctx=None):\n        eval_ctx = get_eval_context(self, eval_ctx)\n        if eval_ctx.volatile:\n            raise Impossible()\n        if eval_ctx.autoescape:\n            return Markup(self.data)\n        return self.data\n\n\nclass Tuple(Literal):\n    \"\"\"For loop unpacking and some other things like multiple arguments\n    for subscripts.  Like for :class:`Name` `ctx` specifies if the tuple\n    is used for loading the names or storing.\n    \"\"\"\n    fields = ('items', 'ctx')\n\n    def as_const(self, eval_ctx=None):\n        eval_ctx = get_eval_context(self, eval_ctx)\n        return tuple(x.as_const(eval_ctx) for x in self.items)\n\n    def can_assign(self):\n        for item in self.items:\n            if not item.can_assign():\n                return False\n        return True\n\n\nclass List(Literal):\n    \"\"\"Any list literal such as ``[1, 2, 3]``\"\"\"\n    fields = ('items',)\n\n    def as_const(self, eval_ctx=None):\n        eval_ctx = get_eval_context(self, eval_ctx)\n        return [x.as_const(eval_ctx) for x in self.items]\n\n\nclass Dict(Literal):\n    \"\"\"Any dict literal such as ``{1: 2, 3: 4}``.  The items must be a list of\n    :class:`Pair` nodes.\n    \"\"\"\n    fields = ('items',)\n\n    def as_const(self, eval_ctx=None):\n        eval_ctx = get_eval_context(self, eval_ctx)\n        return dict(x.as_const(eval_ctx) for x in self.items)\n\n\nclass Pair(Helper):\n    \"\"\"A key, value pair for dicts.\"\"\"\n    fields = ('key', 'value')\n\n    def as_const(self, eval_ctx=None):\n        eval_ctx = get_eval_context(self, eval_ctx)\n        return self.key.as_const(eval_ctx), self.value.as_const(eval_ctx)\n\n\nclass Keyword(Helper):\n    \"\"\"A key, value pair for keyword arguments where key is a string.\"\"\"\n    fields = ('key', 'value')\n\n    def as_const(self, eval_ctx=None):\n        eval_ctx = get_eval_context(self, eval_ctx)\n        return self.key, self.value.as_const(eval_ctx)\n\n\nclass CondExpr(Expr):\n    \"\"\"A conditional expression (inline if expression).  (``{{\n    foo if bar else baz }}``)\n    \"\"\"\n    fields = ('test', 'expr1', 'expr2')\n\n    def as_const(self, eval_ctx=None):\n        eval_ctx = get_eval_context(self, eval_ctx)\n        if self.test.as_const(eval_ctx):\n            return self.expr1.as_const(eval_ctx)\n\n        # if we evaluate to an undefined object, we better do that at runtime\n        if self.expr2 is None:\n            raise Impossible()\n\n        return self.expr2.as_const(eval_ctx)\n\n\nclass Filter(Expr):\n    \"\"\"This node applies a filter on an expression.  `name` is the name of\n    the filter, the rest of the fields are the same as for :class:`Call`.\n\n    If the `node` of a filter is `None` the contents of the last buffer are\n    filtered.  Buffers are created by macros and filter blocks.\n    \"\"\"\n    fields = ('node', 'name', 'args', 'kwargs', 'dyn_args', 'dyn_kwargs')\n\n    def as_const(self, eval_ctx=None):\n        eval_ctx = get_eval_context(self, eval_ctx)\n        if eval_ctx.volatile or self.node is None:\n            raise Impossible()\n        # we have to be careful here because we call filter_ below.\n        # if this variable would be called filter, 2to3 would wrap the\n        # call in a list beause it is assuming we are talking about the\n        # builtin filter function here which no longer returns a list in\n        # python 3.  because of that, do not rename filter_ to filter!\n        filter_ = self.environment.filters.get(self.name)\n        if filter_ is None or getattr(filter_, 'contextfilter', False):\n            raise Impossible()\n        obj = self.node.as_const(eval_ctx)\n        args = [x.as_const(eval_ctx) for x in self.args]\n        if getattr(filter_, 'evalcontextfilter', False):\n            args.insert(0, eval_ctx)\n        elif getattr(filter_, 'environmentfilter', False):\n            args.insert(0, self.environment)\n        kwargs = dict(x.as_const(eval_ctx) for x in self.kwargs)\n        if self.dyn_args is not None:\n            try:\n                args.extend(self.dyn_args.as_const(eval_ctx))\n            except Exception:\n                raise Impossible()\n        if self.dyn_kwargs is not None:\n            try:\n                kwargs.update(self.dyn_kwargs.as_const(eval_ctx))\n            except Exception:\n                raise Impossible()\n        try:\n            return filter_(obj, *args, **kwargs)\n        except Exception:\n            raise Impossible()\n\n\nclass Test(Expr):\n    \"\"\"Applies a test on an expression.  `name` is the name of the test, the\n    rest of the fields are the same as for :class:`Call`.\n    \"\"\"\n    fields = ('node', 'name', 'args', 'kwargs', 'dyn_args', 'dyn_kwargs')\n\n\nclass Call(Expr):\n    \"\"\"Calls an expression.  `args` is a list of arguments, `kwargs` a list\n    of keyword arguments (list of :class:`Keyword` nodes), and `dyn_args`\n    and `dyn_kwargs` has to be either `None` or a node that is used as\n    node for dynamic positional (``*args``) or keyword (``**kwargs``)\n    arguments.\n    \"\"\"\n    fields = ('node', 'args', 'kwargs', 'dyn_args', 'dyn_kwargs')\n\n    def as_const(self, eval_ctx=None):\n        eval_ctx = get_eval_context(self, eval_ctx)\n        if eval_ctx.volatile:\n            raise Impossible()\n        obj = self.node.as_const(eval_ctx)\n\n        # don't evaluate context functions\n        args = [x.as_const(eval_ctx) for x in self.args]\n        if isinstance(obj, _context_function_types):\n            if getattr(obj, 'contextfunction', False):\n                raise Impossible()\n            elif getattr(obj, 'evalcontextfunction', False):\n                args.insert(0, eval_ctx)\n            elif getattr(obj, 'environmentfunction', False):\n                args.insert(0, self.environment)\n\n        kwargs = dict(x.as_const(eval_ctx) for x in self.kwargs)\n        if self.dyn_args is not None:\n            try:\n                args.extend(self.dyn_args.as_const(eval_ctx))\n            except Exception:\n                raise Impossible()\n        if self.dyn_kwargs is not None:\n            try:\n                kwargs.update(self.dyn_kwargs.as_const(eval_ctx))\n            except Exception:\n                raise Impossible()\n        try:\n            return obj(*args, **kwargs)\n        except Exception:\n            raise Impossible()\n\n\nclass Getitem(Expr):\n    \"\"\"Get an attribute or item from an expression and prefer the item.\"\"\"\n    fields = ('node', 'arg', 'ctx')\n\n    def as_const(self, eval_ctx=None):\n        eval_ctx = get_eval_context(self, eval_ctx)\n        if self.ctx != 'load':\n            raise Impossible()\n        try:\n            return self.environment.getitem(self.node.as_const(eval_ctx),\n                                            self.arg.as_const(eval_ctx))\n        except Exception:\n            raise Impossible()\n\n    def can_assign(self):\n        return False\n\n\nclass Getattr(Expr):\n    \"\"\"Get an attribute or item from an expression that is a ascii-only\n    bytestring and prefer the attribute.\n    \"\"\"\n    fields = ('node', 'attr', 'ctx')\n\n    def as_const(self, eval_ctx=None):\n        if self.ctx != 'load':\n            raise Impossible()\n        try:\n            eval_ctx = get_eval_context(self, eval_ctx)\n            return self.environment.getattr(self.node.as_const(eval_ctx),\n                                            self.attr)\n        except Exception:\n            raise Impossible()\n\n    def can_assign(self):\n        return False\n\n\nclass Slice(Expr):\n    \"\"\"Represents a slice object.  This must only be used as argument for\n    :class:`Subscript`.\n    \"\"\"\n    fields = ('start', 'stop', 'step')\n\n    def as_const(self, eval_ctx=None):\n        eval_ctx = get_eval_context(self, eval_ctx)\n        def const(obj):\n            if obj is None:\n                return None\n            return obj.as_const(eval_ctx)\n        return slice(const(self.start), const(self.stop), const(self.step))\n\n\nclass Concat(Expr):\n    \"\"\"Concatenates the list of expressions provided after converting them to\n    unicode.\n    \"\"\"\n    fields = ('nodes',)\n\n    def as_const(self, eval_ctx=None):\n        eval_ctx = get_eval_context(self, eval_ctx)\n        return ''.join(text_type(x.as_const(eval_ctx)) for x in self.nodes)\n\n\nclass Compare(Expr):\n    \"\"\"Compares an expression with some other expressions.  `ops` must be a\n    list of :class:`Operand`\\s.\n    \"\"\"\n    fields = ('expr', 'ops')\n\n    def as_const(self, eval_ctx=None):\n        eval_ctx = get_eval_context(self, eval_ctx)\n        result = value = self.expr.as_const(eval_ctx)\n        try:\n            for op in self.ops:\n                new_value = op.expr.as_const(eval_ctx)\n                result = _cmpop_to_func[op.op](value, new_value)\n                value = new_value\n        except Exception:\n            raise Impossible()\n        return result\n\n\nclass Operand(Helper):\n    \"\"\"Holds an operator and an expression.\"\"\"\n    fields = ('op', 'expr')\n\nif __debug__:\n    Operand.__doc__ += '\\nThe following operators are available: ' + \\\n        ', '.join(sorted('``%s``' % x for x in set(_binop_to_func) |\n                  set(_uaop_to_func) | set(_cmpop_to_func)))\n\n\nclass Mul(BinExpr):\n    \"\"\"Multiplies the left with the right node.\"\"\"\n    operator = '*'\n\n\nclass Div(BinExpr):\n    \"\"\"Divides the left by the right node.\"\"\"\n    operator = '/'\n\n\nclass FloorDiv(BinExpr):\n    \"\"\"Divides the left by the right node and truncates conver the\n    result into an integer by truncating.\n    \"\"\"\n    operator = '//'\n\n\nclass Add(BinExpr):\n    \"\"\"Add the left to the right node.\"\"\"\n    operator = '+'\n\n\nclass Sub(BinExpr):\n    \"\"\"Subtract the right from the left node.\"\"\"\n    operator = '-'\n\n\nclass Mod(BinExpr):\n    \"\"\"Left modulo right.\"\"\"\n    operator = '%'\n\n\nclass Pow(BinExpr):\n    \"\"\"Left to the power of right.\"\"\"\n    operator = '**'\n\n\nclass And(BinExpr):\n    \"\"\"Short circuited AND.\"\"\"\n    operator = 'and'\n\n    def as_const(self, eval_ctx=None):\n        eval_ctx = get_eval_context(self, eval_ctx)\n        return self.left.as_const(eval_ctx) and self.right.as_const(eval_ctx)\n\n\nclass Or(BinExpr):\n    \"\"\"Short circuited OR.\"\"\"\n    operator = 'or'\n\n    def as_const(self, eval_ctx=None):\n        eval_ctx = get_eval_context(self, eval_ctx)\n        return self.left.as_const(eval_ctx) or self.right.as_const(eval_ctx)\n\n\nclass Not(UnaryExpr):\n    \"\"\"Negate the expression.\"\"\"\n    operator = 'not'\n\n\nclass Neg(UnaryExpr):\n    \"\"\"Make the expression negative.\"\"\"\n    operator = '-'\n\n\nclass Pos(UnaryExpr):\n    \"\"\"Make the expression positive (noop for most expressions)\"\"\"\n    operator = '+'\n\n\n# Helpers for extensions\n\n\nclass EnvironmentAttribute(Expr):\n    \"\"\"Loads an attribute from the environment object.  This is useful for\n    extensions that want to call a callback stored on the environment.\n    \"\"\"\n    fields = ('name',)\n\n\nclass ExtensionAttribute(Expr):\n    \"\"\"Returns the attribute of an extension bound to the environment.\n    The identifier is the identifier of the :class:`Extension`.\n\n    This node is usually constructed by calling the\n    :meth:`~jinja2.ext.Extension.attr` method on an extension.\n    \"\"\"\n    fields = ('identifier', 'name')\n\n\nclass ImportedName(Expr):\n    \"\"\"If created with an import name the import name is returned on node\n    access.  For example ``ImportedName('cgi.escape')`` returns the `escape`\n    function from the cgi module on evaluation.  Imports are optimized by the\n    compiler so there is no need to assign them to local variables.\n    \"\"\"\n    fields = ('importname',)\n\n\nclass InternalName(Expr):\n    \"\"\"An internal name in the compiler.  You cannot create these nodes\n    yourself but the parser provides a\n    :meth:`~jinja2.parser.Parser.free_identifier` method that creates\n    a new identifier for you.  This identifier is not available from the\n    template and is not threated specially by the compiler.\n    \"\"\"\n    fields = ('name',)\n\n    def __init__(self):\n        raise TypeError('Can\\'t create internal names.  Use the '\n                        '`free_identifier` method on a parser.')\n\n\nclass MarkSafe(Expr):\n    \"\"\"Mark the wrapped expression as safe (wrap it as `Markup`).\"\"\"\n    fields = ('expr',)\n\n    def as_const(self, eval_ctx=None):\n        eval_ctx = get_eval_context(self, eval_ctx)\n        return Markup(self.expr.as_const(eval_ctx))\n\n\nclass MarkSafeIfAutoescape(Expr):\n    \"\"\"Mark the wrapped expression as safe (wrap it as `Markup`) but\n    only if autoescaping is active.\n\n    .. versionadded:: 2.5\n    \"\"\"\n    fields = ('expr',)\n\n    def as_const(self, eval_ctx=None):\n        eval_ctx = get_eval_context(self, eval_ctx)\n        if eval_ctx.volatile:\n            raise Impossible()\n        expr = self.expr.as_const(eval_ctx)\n        if eval_ctx.autoescape:\n            return Markup(expr)\n        return expr\n\n\nclass ContextReference(Expr):\n    \"\"\"Returns the current template context.  It can be used like a\n    :class:`Name` node, with a ``'load'`` ctx and will return the\n    current :class:`~jinja2.runtime.Context` object.\n\n    Here an example that assigns the current template name to a\n    variable named `foo`::\n\n        Assign(Name('foo', ctx='store'),\n               Getattr(ContextReference(), 'name'))\n    \"\"\"\n\n\nclass Continue(Stmt):\n    \"\"\"Continue a loop.\"\"\"\n\n\nclass Break(Stmt):\n    \"\"\"Break a loop.\"\"\"\n\n\nclass Scope(Stmt):\n    \"\"\"An artificial scope.\"\"\"\n    fields = ('body',)\n\n\nclass EvalContextModifier(Stmt):\n    \"\"\"Modifies the eval context.  For each option that should be modified,\n    a :class:`Keyword` has to be added to the :attr:`options` list.\n\n    Example to change the `autoescape` setting::\n\n        EvalContextModifier(options=[Keyword('autoescape', Const(True))])\n    \"\"\"\n    fields = ('options',)\n\n\nclass ScopedEvalContextModifier(EvalContextModifier):\n    \"\"\"Modifies the eval context and reverts it later.  Works exactly like\n    :class:`EvalContextModifier` but will only modify the\n    :class:`~jinja2.nodes.EvalContext` for nodes in the :attr:`body`.\n    \"\"\"\n    fields = ('body',)\n\n\n# make sure nobody creates custom nodes\ndef _failing_new(*args, **kwargs):\n    raise TypeError('can\\'t create custom node types')\nNodeType.__new__ = staticmethod(_failing_new); del _failing_new\n"
  },
  {
    "path": "lib/jinja2/optimizer.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    jinja2.optimizer\n    ~~~~~~~~~~~~~~~~\n\n    The jinja optimizer is currently trying to constant fold a few expressions\n    and modify the AST in place so that it should be easier to evaluate it.\n\n    Because the AST does not contain all the scoping information and the\n    compiler has to find that out, we cannot do all the optimizations we\n    want.  For example loop unrolling doesn't work because unrolled loops would\n    have a different scoping.\n\n    The solution would be a second syntax tree that has the scoping rules stored.\n\n    :copyright: (c) 2010 by the Jinja Team.\n    :license: BSD.\n\"\"\"\nfrom jinja2 import nodes\nfrom jinja2.visitor import NodeTransformer\n\n\ndef optimize(node, environment):\n    \"\"\"The context hint can be used to perform an static optimization\n    based on the context given.\"\"\"\n    optimizer = Optimizer(environment)\n    return optimizer.visit(node)\n\n\nclass Optimizer(NodeTransformer):\n\n    def __init__(self, environment):\n        self.environment = environment\n\n    def visit_If(self, node):\n        \"\"\"Eliminate dead code.\"\"\"\n        # do not optimize ifs that have a block inside so that it doesn't\n        # break super().\n        if node.find(nodes.Block) is not None:\n            return self.generic_visit(node)\n        try:\n            val = self.visit(node.test).as_const()\n        except nodes.Impossible:\n            return self.generic_visit(node)\n        if val:\n            body = node.body\n        else:\n            body = node.else_\n        result = []\n        for node in body:\n            result.extend(self.visit_list(node))\n        return result\n\n    def fold(self, node):\n        \"\"\"Do constant folding.\"\"\"\n        node = self.generic_visit(node)\n        try:\n            return nodes.Const.from_untrusted(node.as_const(),\n                                              lineno=node.lineno,\n                                              environment=self.environment)\n        except nodes.Impossible:\n            return node\n\n    visit_Add = visit_Sub = visit_Mul = visit_Div = visit_FloorDiv = \\\n    visit_Pow = visit_Mod = visit_And = visit_Or = visit_Pos = visit_Neg = \\\n    visit_Not = visit_Compare = visit_Getitem = visit_Getattr = visit_Call = \\\n    visit_Filter = visit_Test = visit_CondExpr = fold\n    del fold\n"
  },
  {
    "path": "lib/jinja2/parser.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    jinja2.parser\n    ~~~~~~~~~~~~~\n\n    Implements the template parser.\n\n    :copyright: (c) 2010 by the Jinja Team.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nfrom jinja2 import nodes\nfrom jinja2.exceptions import TemplateSyntaxError, TemplateAssertionError\nfrom jinja2.lexer import describe_token, describe_token_expr\nfrom jinja2._compat import imap\n\n\n_statement_keywords = frozenset(['for', 'if', 'block', 'extends', 'print',\n                                 'macro', 'include', 'from', 'import',\n                                 'set'])\n_compare_operators = frozenset(['eq', 'ne', 'lt', 'lteq', 'gt', 'gteq'])\n\n\nclass Parser(object):\n    \"\"\"This is the central parsing class Jinja2 uses.  It's passed to\n    extensions and can be used to parse expressions or statements.\n    \"\"\"\n\n    def __init__(self, environment, source, name=None, filename=None,\n                 state=None):\n        self.environment = environment\n        self.stream = environment._tokenize(source, name, filename, state)\n        self.name = name\n        self.filename = filename\n        self.closed = False\n        self.extensions = {}\n        for extension in environment.iter_extensions():\n            for tag in extension.tags:\n                self.extensions[tag] = extension.parse\n        self._last_identifier = 0\n        self._tag_stack = []\n        self._end_token_stack = []\n\n    def fail(self, msg, lineno=None, exc=TemplateSyntaxError):\n        \"\"\"Convenience method that raises `exc` with the message, passed\n        line number or last line number as well as the current name and\n        filename.\n        \"\"\"\n        if lineno is None:\n            lineno = self.stream.current.lineno\n        raise exc(msg, lineno, self.name, self.filename)\n\n    def _fail_ut_eof(self, name, end_token_stack, lineno):\n        expected = []\n        for exprs in end_token_stack:\n            expected.extend(imap(describe_token_expr, exprs))\n        if end_token_stack:\n            currently_looking = ' or '.join(\n                \"'%s'\" % describe_token_expr(expr)\n                for expr in end_token_stack[-1])\n        else:\n            currently_looking = None\n\n        if name is None:\n            message = ['Unexpected end of template.']\n        else:\n            message = ['Encountered unknown tag \\'%s\\'.' % name]\n\n        if currently_looking:\n            if name is not None and name in expected:\n                message.append('You probably made a nesting mistake. Jinja '\n                               'is expecting this tag, but currently looking '\n                               'for %s.' % currently_looking)\n            else:\n                message.append('Jinja was looking for the following tags: '\n                               '%s.' % currently_looking)\n\n        if self._tag_stack:\n            message.append('The innermost block that needs to be '\n                           'closed is \\'%s\\'.' % self._tag_stack[-1])\n\n        self.fail(' '.join(message), lineno)\n\n    def fail_unknown_tag(self, name, lineno=None):\n        \"\"\"Called if the parser encounters an unknown tag.  Tries to fail\n        with a human readable error message that could help to identify\n        the problem.\n        \"\"\"\n        return self._fail_ut_eof(name, self._end_token_stack, lineno)\n\n    def fail_eof(self, end_tokens=None, lineno=None):\n        \"\"\"Like fail_unknown_tag but for end of template situations.\"\"\"\n        stack = list(self._end_token_stack)\n        if end_tokens is not None:\n            stack.append(end_tokens)\n        return self._fail_ut_eof(None, stack, lineno)\n\n    def is_tuple_end(self, extra_end_rules=None):\n        \"\"\"Are we at the end of a tuple?\"\"\"\n        if self.stream.current.type in ('variable_end', 'block_end', 'rparen'):\n            return True\n        elif extra_end_rules is not None:\n            return self.stream.current.test_any(extra_end_rules)\n        return False\n\n    def free_identifier(self, lineno=None):\n        \"\"\"Return a new free identifier as :class:`~jinja2.nodes.InternalName`.\"\"\"\n        self._last_identifier += 1\n        rv = object.__new__(nodes.InternalName)\n        nodes.Node.__init__(rv, 'fi%d' % self._last_identifier, lineno=lineno)\n        return rv\n\n    def parse_statement(self):\n        \"\"\"Parse a single statement.\"\"\"\n        token = self.stream.current\n        if token.type != 'name':\n            self.fail('tag name expected', token.lineno)\n        self._tag_stack.append(token.value)\n        pop_tag = True\n        try:\n            if token.value in _statement_keywords:\n                return getattr(self, 'parse_' + self.stream.current.value)()\n            if token.value == 'call':\n                return self.parse_call_block()\n            if token.value == 'filter':\n                return self.parse_filter_block()\n            ext = self.extensions.get(token.value)\n            if ext is not None:\n                return ext(self)\n\n            # did not work out, remove the token we pushed by accident\n            # from the stack so that the unknown tag fail function can\n            # produce a proper error message.\n            self._tag_stack.pop()\n            pop_tag = False\n            self.fail_unknown_tag(token.value, token.lineno)\n        finally:\n            if pop_tag:\n                self._tag_stack.pop()\n\n    def parse_statements(self, end_tokens, drop_needle=False):\n        \"\"\"Parse multiple statements into a list until one of the end tokens\n        is reached.  This is used to parse the body of statements as it also\n        parses template data if appropriate.  The parser checks first if the\n        current token is a colon and skips it if there is one.  Then it checks\n        for the block end and parses until if one of the `end_tokens` is\n        reached.  Per default the active token in the stream at the end of\n        the call is the matched end token.  If this is not wanted `drop_needle`\n        can be set to `True` and the end token is removed.\n        \"\"\"\n        # the first token may be a colon for python compatibility\n        self.stream.skip_if('colon')\n\n        # in the future it would be possible to add whole code sections\n        # by adding some sort of end of statement token and parsing those here.\n        self.stream.expect('block_end')\n        result = self.subparse(end_tokens)\n\n        # we reached the end of the template too early, the subparser\n        # does not check for this, so we do that now\n        if self.stream.current.type == 'eof':\n            self.fail_eof(end_tokens)\n\n        if drop_needle:\n            next(self.stream)\n        return result\n\n    def parse_set(self):\n        \"\"\"Parse an assign statement.\"\"\"\n        lineno = next(self.stream).lineno\n        target = self.parse_assign_target()\n        if self.stream.skip_if('assign'):\n            expr = self.parse_tuple()\n            return nodes.Assign(target, expr, lineno=lineno)\n        body = self.parse_statements(('name:endset',),\n                                     drop_needle=True)\n        return nodes.AssignBlock(target, body, lineno=lineno)\n\n    def parse_for(self):\n        \"\"\"Parse a for loop.\"\"\"\n        lineno = self.stream.expect('name:for').lineno\n        target = self.parse_assign_target(extra_end_rules=('name:in',))\n        self.stream.expect('name:in')\n        iter = self.parse_tuple(with_condexpr=False,\n                                extra_end_rules=('name:recursive',))\n        test = None\n        if self.stream.skip_if('name:if'):\n            test = self.parse_expression()\n        recursive = self.stream.skip_if('name:recursive')\n        body = self.parse_statements(('name:endfor', 'name:else'))\n        if next(self.stream).value == 'endfor':\n            else_ = []\n        else:\n            else_ = self.parse_statements(('name:endfor',), drop_needle=True)\n        return nodes.For(target, iter, body, else_, test,\n                         recursive, lineno=lineno)\n\n    def parse_if(self):\n        \"\"\"Parse an if construct.\"\"\"\n        node = result = nodes.If(lineno=self.stream.expect('name:if').lineno)\n        while 1:\n            node.test = self.parse_tuple(with_condexpr=False)\n            node.body = self.parse_statements(('name:elif', 'name:else',\n                                               'name:endif'))\n            token = next(self.stream)\n            if token.test('name:elif'):\n                new_node = nodes.If(lineno=self.stream.current.lineno)\n                node.else_ = [new_node]\n                node = new_node\n                continue\n            elif token.test('name:else'):\n                node.else_ = self.parse_statements(('name:endif',),\n                                                   drop_needle=True)\n            else:\n                node.else_ = []\n            break\n        return result\n\n    def parse_block(self):\n        node = nodes.Block(lineno=next(self.stream).lineno)\n        node.name = self.stream.expect('name').value\n        node.scoped = self.stream.skip_if('name:scoped')\n\n        # common problem people encounter when switching from django\n        # to jinja.  we do not support hyphens in block names, so let's\n        # raise a nicer error message in that case.\n        if self.stream.current.type == 'sub':\n            self.fail('Block names in Jinja have to be valid Python '\n                      'identifiers and may not contain hyphens, use an '\n                      'underscore instead.')\n\n        node.body = self.parse_statements(('name:endblock',), drop_needle=True)\n        self.stream.skip_if('name:' + node.name)\n        return node\n\n    def parse_extends(self):\n        node = nodes.Extends(lineno=next(self.stream).lineno)\n        node.template = self.parse_expression()\n        return node\n\n    def parse_import_context(self, node, default):\n        if self.stream.current.test_any('name:with', 'name:without') and \\\n           self.stream.look().test('name:context'):\n            node.with_context = next(self.stream).value == 'with'\n            self.stream.skip()\n        else:\n            node.with_context = default\n        return node\n\n    def parse_include(self):\n        node = nodes.Include(lineno=next(self.stream).lineno)\n        node.template = self.parse_expression()\n        if self.stream.current.test('name:ignore') and \\\n           self.stream.look().test('name:missing'):\n            node.ignore_missing = True\n            self.stream.skip(2)\n        else:\n            node.ignore_missing = False\n        return self.parse_import_context(node, True)\n\n    def parse_import(self):\n        node = nodes.Import(lineno=next(self.stream).lineno)\n        node.template = self.parse_expression()\n        self.stream.expect('name:as')\n        node.target = self.parse_assign_target(name_only=True).name\n        return self.parse_import_context(node, False)\n\n    def parse_from(self):\n        node = nodes.FromImport(lineno=next(self.stream).lineno)\n        node.template = self.parse_expression()\n        self.stream.expect('name:import')\n        node.names = []\n\n        def parse_context():\n            if self.stream.current.value in ('with', 'without') and \\\n               self.stream.look().test('name:context'):\n                node.with_context = next(self.stream).value == 'with'\n                self.stream.skip()\n                return True\n            return False\n\n        while 1:\n            if node.names:\n                self.stream.expect('comma')\n            if self.stream.current.type == 'name':\n                if parse_context():\n                    break\n                target = self.parse_assign_target(name_only=True)\n                if target.name.startswith('_'):\n                    self.fail('names starting with an underline can not '\n                              'be imported', target.lineno,\n                              exc=TemplateAssertionError)\n                if self.stream.skip_if('name:as'):\n                    alias = self.parse_assign_target(name_only=True)\n                    node.names.append((target.name, alias.name))\n                else:\n                    node.names.append(target.name)\n                if parse_context() or self.stream.current.type != 'comma':\n                    break\n            else:\n                break\n        if not hasattr(node, 'with_context'):\n            node.with_context = False\n            self.stream.skip_if('comma')\n        return node\n\n    def parse_signature(self, node):\n        node.args = args = []\n        node.defaults = defaults = []\n        self.stream.expect('lparen')\n        while self.stream.current.type != 'rparen':\n            if args:\n                self.stream.expect('comma')\n            arg = self.parse_assign_target(name_only=True)\n            arg.set_ctx('param')\n            if self.stream.skip_if('assign'):\n                defaults.append(self.parse_expression())\n            elif defaults:\n                self.fail('non-default argument follows default argument')\n            args.append(arg)\n        self.stream.expect('rparen')\n\n    def parse_call_block(self):\n        node = nodes.CallBlock(lineno=next(self.stream).lineno)\n        if self.stream.current.type == 'lparen':\n            self.parse_signature(node)\n        else:\n            node.args = []\n            node.defaults = []\n\n        node.call = self.parse_expression()\n        if not isinstance(node.call, nodes.Call):\n            self.fail('expected call', node.lineno)\n        node.body = self.parse_statements(('name:endcall',), drop_needle=True)\n        return node\n\n    def parse_filter_block(self):\n        node = nodes.FilterBlock(lineno=next(self.stream).lineno)\n        node.filter = self.parse_filter(None, start_inline=True)\n        node.body = self.parse_statements(('name:endfilter',),\n                                          drop_needle=True)\n        return node\n\n    def parse_macro(self):\n        node = nodes.Macro(lineno=next(self.stream).lineno)\n        node.name = self.parse_assign_target(name_only=True).name\n        self.parse_signature(node)\n        node.body = self.parse_statements(('name:endmacro',),\n                                          drop_needle=True)\n        return node\n\n    def parse_print(self):\n        node = nodes.Output(lineno=next(self.stream).lineno)\n        node.nodes = []\n        while self.stream.current.type != 'block_end':\n            if node.nodes:\n                self.stream.expect('comma')\n            node.nodes.append(self.parse_expression())\n        return node\n\n    def parse_assign_target(self, with_tuple=True, name_only=False,\n                            extra_end_rules=None):\n        \"\"\"Parse an assignment target.  As Jinja2 allows assignments to\n        tuples, this function can parse all allowed assignment targets.  Per\n        default assignments to tuples are parsed, that can be disable however\n        by setting `with_tuple` to `False`.  If only assignments to names are\n        wanted `name_only` can be set to `True`.  The `extra_end_rules`\n        parameter is forwarded to the tuple parsing function.\n        \"\"\"\n        if name_only:\n            token = self.stream.expect('name')\n            target = nodes.Name(token.value, 'store', lineno=token.lineno)\n        else:\n            if with_tuple:\n                target = self.parse_tuple(simplified=True,\n                                          extra_end_rules=extra_end_rules)\n            else:\n                target = self.parse_primary()\n            target.set_ctx('store')\n        if not target.can_assign():\n            self.fail('can\\'t assign to %r' % target.__class__.\n                      __name__.lower(), target.lineno)\n        return target\n\n    def parse_expression(self, with_condexpr=True):\n        \"\"\"Parse an expression.  Per default all expressions are parsed, if\n        the optional `with_condexpr` parameter is set to `False` conditional\n        expressions are not parsed.\n        \"\"\"\n        if with_condexpr:\n            return self.parse_condexpr()\n        return self.parse_or()\n\n    def parse_condexpr(self):\n        lineno = self.stream.current.lineno\n        expr1 = self.parse_or()\n        while self.stream.skip_if('name:if'):\n            expr2 = self.parse_or()\n            if self.stream.skip_if('name:else'):\n                expr3 = self.parse_condexpr()\n            else:\n                expr3 = None\n            expr1 = nodes.CondExpr(expr2, expr1, expr3, lineno=lineno)\n            lineno = self.stream.current.lineno\n        return expr1\n\n    def parse_or(self):\n        lineno = self.stream.current.lineno\n        left = self.parse_and()\n        while self.stream.skip_if('name:or'):\n            right = self.parse_and()\n            left = nodes.Or(left, right, lineno=lineno)\n            lineno = self.stream.current.lineno\n        return left\n\n    def parse_and(self):\n        lineno = self.stream.current.lineno\n        left = self.parse_not()\n        while self.stream.skip_if('name:and'):\n            right = self.parse_not()\n            left = nodes.And(left, right, lineno=lineno)\n            lineno = self.stream.current.lineno\n        return left\n\n    def parse_not(self):\n        if self.stream.current.test('name:not'):\n            lineno = next(self.stream).lineno\n            return nodes.Not(self.parse_not(), lineno=lineno)\n        return self.parse_compare()\n\n    def parse_compare(self):\n        lineno = self.stream.current.lineno\n        expr = self.parse_add()\n        ops = []\n        while 1:\n            token_type = self.stream.current.type\n            if token_type in _compare_operators:\n                next(self.stream)\n                ops.append(nodes.Operand(token_type, self.parse_add()))\n            elif self.stream.skip_if('name:in'):\n                ops.append(nodes.Operand('in', self.parse_add()))\n            elif (self.stream.current.test('name:not') and\n                  self.stream.look().test('name:in')):\n                self.stream.skip(2)\n                ops.append(nodes.Operand('notin', self.parse_add()))\n            else:\n                break\n            lineno = self.stream.current.lineno\n        if not ops:\n            return expr\n        return nodes.Compare(expr, ops, lineno=lineno)\n\n    def parse_add(self):\n        lineno = self.stream.current.lineno\n        left = self.parse_sub()\n        while self.stream.current.type == 'add':\n            next(self.stream)\n            right = self.parse_sub()\n            left = nodes.Add(left, right, lineno=lineno)\n            lineno = self.stream.current.lineno\n        return left\n\n    def parse_sub(self):\n        lineno = self.stream.current.lineno\n        left = self.parse_concat()\n        while self.stream.current.type == 'sub':\n            next(self.stream)\n            right = self.parse_concat()\n            left = nodes.Sub(left, right, lineno=lineno)\n            lineno = self.stream.current.lineno\n        return left\n\n    def parse_concat(self):\n        lineno = self.stream.current.lineno\n        args = [self.parse_mul()]\n        while self.stream.current.type == 'tilde':\n            next(self.stream)\n            args.append(self.parse_mul())\n        if len(args) == 1:\n            return args[0]\n        return nodes.Concat(args, lineno=lineno)\n\n    def parse_mul(self):\n        lineno = self.stream.current.lineno\n        left = self.parse_div()\n        while self.stream.current.type == 'mul':\n            next(self.stream)\n            right = self.parse_div()\n            left = nodes.Mul(left, right, lineno=lineno)\n            lineno = self.stream.current.lineno\n        return left\n\n    def parse_div(self):\n        lineno = self.stream.current.lineno\n        left = self.parse_floordiv()\n        while self.stream.current.type == 'div':\n            next(self.stream)\n            right = self.parse_floordiv()\n            left = nodes.Div(left, right, lineno=lineno)\n            lineno = self.stream.current.lineno\n        return left\n\n    def parse_floordiv(self):\n        lineno = self.stream.current.lineno\n        left = self.parse_mod()\n        while self.stream.current.type == 'floordiv':\n            next(self.stream)\n            right = self.parse_mod()\n            left = nodes.FloorDiv(left, right, lineno=lineno)\n            lineno = self.stream.current.lineno\n        return left\n\n    def parse_mod(self):\n        lineno = self.stream.current.lineno\n        left = self.parse_pow()\n        while self.stream.current.type == 'mod':\n            next(self.stream)\n            right = self.parse_pow()\n            left = nodes.Mod(left, right, lineno=lineno)\n            lineno = self.stream.current.lineno\n        return left\n\n    def parse_pow(self):\n        lineno = self.stream.current.lineno\n        left = self.parse_unary()\n        while self.stream.current.type == 'pow':\n            next(self.stream)\n            right = self.parse_unary()\n            left = nodes.Pow(left, right, lineno=lineno)\n            lineno = self.stream.current.lineno\n        return left\n\n    def parse_unary(self, with_filter=True):\n        token_type = self.stream.current.type\n        lineno = self.stream.current.lineno\n        if token_type == 'sub':\n            next(self.stream)\n            node = nodes.Neg(self.parse_unary(False), lineno=lineno)\n        elif token_type == 'add':\n            next(self.stream)\n            node = nodes.Pos(self.parse_unary(False), lineno=lineno)\n        else:\n            node = self.parse_primary()\n        node = self.parse_postfix(node)\n        if with_filter:\n            node = self.parse_filter_expr(node)\n        return node\n\n    def parse_primary(self):\n        token = self.stream.current\n        if token.type == 'name':\n            if token.value in ('true', 'false', 'True', 'False'):\n                node = nodes.Const(token.value in ('true', 'True'),\n                                   lineno=token.lineno)\n            elif token.value in ('none', 'None'):\n                node = nodes.Const(None, lineno=token.lineno)\n            else:\n                node = nodes.Name(token.value, 'load', lineno=token.lineno)\n            next(self.stream)\n        elif token.type == 'string':\n            next(self.stream)\n            buf = [token.value]\n            lineno = token.lineno\n            while self.stream.current.type == 'string':\n                buf.append(self.stream.current.value)\n                next(self.stream)\n            node = nodes.Const(''.join(buf), lineno=lineno)\n        elif token.type in ('integer', 'float'):\n            next(self.stream)\n            node = nodes.Const(token.value, lineno=token.lineno)\n        elif token.type == 'lparen':\n            next(self.stream)\n            node = self.parse_tuple(explicit_parentheses=True)\n            self.stream.expect('rparen')\n        elif token.type == 'lbracket':\n            node = self.parse_list()\n        elif token.type == 'lbrace':\n            node = self.parse_dict()\n        else:\n            self.fail(\"unexpected '%s'\" % describe_token(token), token.lineno)\n        return node\n\n    def parse_tuple(self, simplified=False, with_condexpr=True,\n                    extra_end_rules=None, explicit_parentheses=False):\n        \"\"\"Works like `parse_expression` but if multiple expressions are\n        delimited by a comma a :class:`~jinja2.nodes.Tuple` node is created.\n        This method could also return a regular expression instead of a tuple\n        if no commas where found.\n\n        The default parsing mode is a full tuple.  If `simplified` is `True`\n        only names and literals are parsed.  The `no_condexpr` parameter is\n        forwarded to :meth:`parse_expression`.\n\n        Because tuples do not require delimiters and may end in a bogus comma\n        an extra hint is needed that marks the end of a tuple.  For example\n        for loops support tuples between `for` and `in`.  In that case the\n        `extra_end_rules` is set to ``['name:in']``.\n\n        `explicit_parentheses` is true if the parsing was triggered by an\n        expression in parentheses.  This is used to figure out if an empty\n        tuple is a valid expression or not.\n        \"\"\"\n        lineno = self.stream.current.lineno\n        if simplified:\n            parse = self.parse_primary\n        elif with_condexpr:\n            parse = self.parse_expression\n        else:\n            parse = lambda: self.parse_expression(with_condexpr=False)\n        args = []\n        is_tuple = False\n        while 1:\n            if args:\n                self.stream.expect('comma')\n            if self.is_tuple_end(extra_end_rules):\n                break\n            args.append(parse())\n            if self.stream.current.type == 'comma':\n                is_tuple = True\n            else:\n                break\n            lineno = self.stream.current.lineno\n\n        if not is_tuple:\n            if args:\n                return args[0]\n\n            # if we don't have explicit parentheses, an empty tuple is\n            # not a valid expression.  This would mean nothing (literally\n            # nothing) in the spot of an expression would be an empty\n            # tuple.\n            if not explicit_parentheses:\n                self.fail('Expected an expression, got \\'%s\\'' %\n                          describe_token(self.stream.current))\n\n        return nodes.Tuple(args, 'load', lineno=lineno)\n\n    def parse_list(self):\n        token = self.stream.expect('lbracket')\n        items = []\n        while self.stream.current.type != 'rbracket':\n            if items:\n                self.stream.expect('comma')\n            if self.stream.current.type == 'rbracket':\n                break\n            items.append(self.parse_expression())\n        self.stream.expect('rbracket')\n        return nodes.List(items, lineno=token.lineno)\n\n    def parse_dict(self):\n        token = self.stream.expect('lbrace')\n        items = []\n        while self.stream.current.type != 'rbrace':\n            if items:\n                self.stream.expect('comma')\n            if self.stream.current.type == 'rbrace':\n                break\n            key = self.parse_expression()\n            self.stream.expect('colon')\n            value = self.parse_expression()\n            items.append(nodes.Pair(key, value, lineno=key.lineno))\n        self.stream.expect('rbrace')\n        return nodes.Dict(items, lineno=token.lineno)\n\n    def parse_postfix(self, node):\n        while 1:\n            token_type = self.stream.current.type\n            if token_type == 'dot' or token_type == 'lbracket':\n                node = self.parse_subscript(node)\n            # calls are valid both after postfix expressions (getattr\n            # and getitem) as well as filters and tests\n            elif token_type == 'lparen':\n                node = self.parse_call(node)\n            else:\n                break\n        return node\n\n    def parse_filter_expr(self, node):\n        while 1:\n            token_type = self.stream.current.type\n            if token_type == 'pipe':\n                node = self.parse_filter(node)\n            elif token_type == 'name' and self.stream.current.value == 'is':\n                node = self.parse_test(node)\n            # calls are valid both after postfix expressions (getattr\n            # and getitem) as well as filters and tests\n            elif token_type == 'lparen':\n                node = self.parse_call(node)\n            else:\n                break\n        return node\n\n    def parse_subscript(self, node):\n        token = next(self.stream)\n        if token.type == 'dot':\n            attr_token = self.stream.current\n            next(self.stream)\n            if attr_token.type == 'name':\n                return nodes.Getattr(node, attr_token.value, 'load',\n                                     lineno=token.lineno)\n            elif attr_token.type != 'integer':\n                self.fail('expected name or number', attr_token.lineno)\n            arg = nodes.Const(attr_token.value, lineno=attr_token.lineno)\n            return nodes.Getitem(node, arg, 'load', lineno=token.lineno)\n        if token.type == 'lbracket':\n            args = []\n            while self.stream.current.type != 'rbracket':\n                if args:\n                    self.stream.expect('comma')\n                args.append(self.parse_subscribed())\n            self.stream.expect('rbracket')\n            if len(args) == 1:\n                arg = args[0]\n            else:\n                arg = nodes.Tuple(args, 'load', lineno=token.lineno)\n            return nodes.Getitem(node, arg, 'load', lineno=token.lineno)\n        self.fail('expected subscript expression', self.lineno)\n\n    def parse_subscribed(self):\n        lineno = self.stream.current.lineno\n\n        if self.stream.current.type == 'colon':\n            next(self.stream)\n            args = [None]\n        else:\n            node = self.parse_expression()\n            if self.stream.current.type != 'colon':\n                return node\n            next(self.stream)\n            args = [node]\n\n        if self.stream.current.type == 'colon':\n            args.append(None)\n        elif self.stream.current.type not in ('rbracket', 'comma'):\n            args.append(self.parse_expression())\n        else:\n            args.append(None)\n\n        if self.stream.current.type == 'colon':\n            next(self.stream)\n            if self.stream.current.type not in ('rbracket', 'comma'):\n                args.append(self.parse_expression())\n            else:\n                args.append(None)\n        else:\n            args.append(None)\n\n        return nodes.Slice(lineno=lineno, *args)\n\n    def parse_call(self, node):\n        token = self.stream.expect('lparen')\n        args = []\n        kwargs = []\n        dyn_args = dyn_kwargs = None\n        require_comma = False\n\n        def ensure(expr):\n            if not expr:\n                self.fail('invalid syntax for function call expression',\n                          token.lineno)\n\n        while self.stream.current.type != 'rparen':\n            if require_comma:\n                self.stream.expect('comma')\n                # support for trailing comma\n                if self.stream.current.type == 'rparen':\n                    break\n            if self.stream.current.type == 'mul':\n                ensure(dyn_args is None and dyn_kwargs is None)\n                next(self.stream)\n                dyn_args = self.parse_expression()\n            elif self.stream.current.type == 'pow':\n                ensure(dyn_kwargs is None)\n                next(self.stream)\n                dyn_kwargs = self.parse_expression()\n            else:\n                ensure(dyn_args is None and dyn_kwargs is None)\n                if self.stream.current.type == 'name' and \\\n                   self.stream.look().type == 'assign':\n                    key = self.stream.current.value\n                    self.stream.skip(2)\n                    value = self.parse_expression()\n                    kwargs.append(nodes.Keyword(key, value,\n                                                lineno=value.lineno))\n                else:\n                    ensure(not kwargs)\n                    args.append(self.parse_expression())\n\n            require_comma = True\n        self.stream.expect('rparen')\n\n        if node is None:\n            return args, kwargs, dyn_args, dyn_kwargs\n        return nodes.Call(node, args, kwargs, dyn_args, dyn_kwargs,\n                          lineno=token.lineno)\n\n    def parse_filter(self, node, start_inline=False):\n        while self.stream.current.type == 'pipe' or start_inline:\n            if not start_inline:\n                next(self.stream)\n            token = self.stream.expect('name')\n            name = token.value\n            while self.stream.current.type == 'dot':\n                next(self.stream)\n                name += '.' + self.stream.expect('name').value\n            if self.stream.current.type == 'lparen':\n                args, kwargs, dyn_args, dyn_kwargs = self.parse_call(None)\n            else:\n                args = []\n                kwargs = []\n                dyn_args = dyn_kwargs = None\n            node = nodes.Filter(node, name, args, kwargs, dyn_args,\n                                dyn_kwargs, lineno=token.lineno)\n            start_inline = False\n        return node\n\n    def parse_test(self, node):\n        token = next(self.stream)\n        if self.stream.current.test('name:not'):\n            next(self.stream)\n            negated = True\n        else:\n            negated = False\n        name = self.stream.expect('name').value\n        while self.stream.current.type == 'dot':\n            next(self.stream)\n            name += '.' + self.stream.expect('name').value\n        dyn_args = dyn_kwargs = None\n        kwargs = []\n        if self.stream.current.type == 'lparen':\n            args, kwargs, dyn_args, dyn_kwargs = self.parse_call(None)\n        elif (self.stream.current.type in ('name', 'string', 'integer',\n                                           'float', 'lparen', 'lbracket',\n                                           'lbrace') and not\n              self.stream.current.test_any('name:else', 'name:or',\n                                           'name:and')):\n            if self.stream.current.test('name:is'):\n                self.fail('You cannot chain multiple tests with is')\n            args = [self.parse_expression()]\n        else:\n            args = []\n        node = nodes.Test(node, name, args, kwargs, dyn_args,\n                          dyn_kwargs, lineno=token.lineno)\n        if negated:\n            node = nodes.Not(node, lineno=token.lineno)\n        return node\n\n    def subparse(self, end_tokens=None):\n        body = []\n        data_buffer = []\n        add_data = data_buffer.append\n\n        if end_tokens is not None:\n            self._end_token_stack.append(end_tokens)\n\n        def flush_data():\n            if data_buffer:\n                lineno = data_buffer[0].lineno\n                body.append(nodes.Output(data_buffer[:], lineno=lineno))\n                del data_buffer[:]\n\n        try:\n            while self.stream:\n                token = self.stream.current\n                if token.type == 'data':\n                    if token.value:\n                        add_data(nodes.TemplateData(token.value,\n                                                    lineno=token.lineno))\n                    next(self.stream)\n                elif token.type == 'variable_begin':\n                    next(self.stream)\n                    add_data(self.parse_tuple(with_condexpr=True))\n                    self.stream.expect('variable_end')\n                elif token.type == 'block_begin':\n                    flush_data()\n                    next(self.stream)\n                    if end_tokens is not None and \\\n                       self.stream.current.test_any(*end_tokens):\n                        return body\n                    rv = self.parse_statement()\n                    if isinstance(rv, list):\n                        body.extend(rv)\n                    else:\n                        body.append(rv)\n                    self.stream.expect('block_end')\n                else:\n                    raise AssertionError('internal parsing error')\n\n            flush_data()\n        finally:\n            if end_tokens is not None:\n                self._end_token_stack.pop()\n\n        return body\n\n    def parse(self):\n        \"\"\"Parse the whole template into a `Template` node.\"\"\"\n        result = nodes.Template(self.subparse(), lineno=1)\n        result.set_environment(self.environment)\n        return result\n"
  },
  {
    "path": "lib/jinja2/runtime.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    jinja2.runtime\n    ~~~~~~~~~~~~~~\n\n    Runtime helpers.\n\n    :copyright: (c) 2010 by the Jinja Team.\n    :license: BSD.\n\"\"\"\nimport sys\n\nfrom itertools import chain\nfrom jinja2.nodes import EvalContext, _context_function_types\nfrom jinja2.utils import Markup, soft_unicode, escape, missing, concat, \\\n     internalcode, object_type_repr\nfrom jinja2.exceptions import UndefinedError, TemplateRuntimeError, \\\n     TemplateNotFound\nfrom jinja2._compat import imap, text_type, iteritems, \\\n     implements_iterator, implements_to_string, string_types, PY2\n\n\n# these variables are exported to the template runtime\n__all__ = ['LoopContext', 'TemplateReference', 'Macro', 'Markup',\n           'TemplateRuntimeError', 'missing', 'concat', 'escape',\n           'markup_join', 'unicode_join', 'to_string', 'identity',\n           'TemplateNotFound', 'make_logging_undefined']\n\n#: the name of the function that is used to convert something into\n#: a string.  We can just use the text type here.\nto_string = text_type\n\n#: the identity function.  Useful for certain things in the environment\nidentity = lambda x: x\n\n_last_iteration = object()\n\n\ndef markup_join(seq):\n    \"\"\"Concatenation that escapes if necessary and converts to unicode.\"\"\"\n    buf = []\n    iterator = imap(soft_unicode, seq)\n    for arg in iterator:\n        buf.append(arg)\n        if hasattr(arg, '__html__'):\n            return Markup(u'').join(chain(buf, iterator))\n    return concat(buf)\n\n\ndef unicode_join(seq):\n    \"\"\"Simple args to unicode conversion and concatenation.\"\"\"\n    return concat(imap(text_type, seq))\n\n\ndef new_context(environment, template_name, blocks, vars=None,\n                shared=None, globals=None, locals=None):\n    \"\"\"Internal helper to for context creation.\"\"\"\n    if vars is None:\n        vars = {}\n    if shared:\n        parent = vars\n    else:\n        parent = dict(globals or (), **vars)\n    if locals:\n        # if the parent is shared a copy should be created because\n        # we don't want to modify the dict passed\n        if shared:\n            parent = dict(parent)\n        for key, value in iteritems(locals):\n            if key[:2] == 'l_' and value is not missing:\n                parent[key[2:]] = value\n    return environment.context_class(environment, parent, template_name,\n                                     blocks)\n\n\nclass TemplateReference(object):\n    \"\"\"The `self` in templates.\"\"\"\n\n    def __init__(self, context):\n        self.__context = context\n\n    def __getitem__(self, name):\n        blocks = self.__context.blocks[name]\n        return BlockReference(name, self.__context, blocks, 0)\n\n    def __repr__(self):\n        return '<%s %r>' % (\n            self.__class__.__name__,\n            self.__context.name\n        )\n\n\nclass Context(object):\n    \"\"\"The template context holds the variables of a template.  It stores the\n    values passed to the template and also the names the template exports.\n    Creating instances is neither supported nor useful as it's created\n    automatically at various stages of the template evaluation and should not\n    be created by hand.\n\n    The context is immutable.  Modifications on :attr:`parent` **must not**\n    happen and modifications on :attr:`vars` are allowed from generated\n    template code only.  Template filters and global functions marked as\n    :func:`contextfunction`\\s get the active context passed as first argument\n    and are allowed to access the context read-only.\n\n    The template context supports read only dict operations (`get`,\n    `keys`, `values`, `items`, `iterkeys`, `itervalues`, `iteritems`,\n    `__getitem__`, `__contains__`).  Additionally there is a :meth:`resolve`\n    method that doesn't fail with a `KeyError` but returns an\n    :class:`Undefined` object for missing variables.\n    \"\"\"\n    __slots__ = ('parent', 'vars', 'environment', 'eval_ctx', 'exported_vars',\n                 'name', 'blocks', '__weakref__')\n\n    def __init__(self, environment, parent, name, blocks):\n        self.parent = parent\n        self.vars = {}\n        self.environment = environment\n        self.eval_ctx = EvalContext(self.environment, name)\n        self.exported_vars = set()\n        self.name = name\n\n        # create the initial mapping of blocks.  Whenever template inheritance\n        # takes place the runtime will update this mapping with the new blocks\n        # from the template.\n        self.blocks = dict((k, [v]) for k, v in iteritems(blocks))\n\n    def super(self, name, current):\n        \"\"\"Render a parent block.\"\"\"\n        try:\n            blocks = self.blocks[name]\n            index = blocks.index(current) + 1\n            blocks[index]\n        except LookupError:\n            return self.environment.undefined('there is no parent block '\n                                              'called %r.' % name,\n                                              name='super')\n        return BlockReference(name, self, blocks, index)\n\n    def get(self, key, default=None):\n        \"\"\"Returns an item from the template context, if it doesn't exist\n        `default` is returned.\n        \"\"\"\n        try:\n            return self[key]\n        except KeyError:\n            return default\n\n    def resolve(self, key):\n        \"\"\"Looks up a variable like `__getitem__` or `get` but returns an\n        :class:`Undefined` object with the name of the name looked up.\n        \"\"\"\n        if key in self.vars:\n            return self.vars[key]\n        if key in self.parent:\n            return self.parent[key]\n        return self.environment.undefined(name=key)\n\n    def get_exported(self):\n        \"\"\"Get a new dict with the exported variables.\"\"\"\n        return dict((k, self.vars[k]) for k in self.exported_vars)\n\n    def get_all(self):\n        \"\"\"Return a copy of the complete context as dict including the\n        exported variables.\n        \"\"\"\n        return dict(self.parent, **self.vars)\n\n    @internalcode\n    def call(__self, __obj, *args, **kwargs):\n        \"\"\"Call the callable with the arguments and keyword arguments\n        provided but inject the active context or environment as first\n        argument if the callable is a :func:`contextfunction` or\n        :func:`environmentfunction`.\n        \"\"\"\n        if __debug__:\n            __traceback_hide__ = True  # noqa\n\n        # Allow callable classes to take a context\n        fn = __obj.__call__\n        for fn_type in ('contextfunction',\n                        'evalcontextfunction',\n                        'environmentfunction'):\n            if hasattr(fn, fn_type):\n                __obj = fn\n                break\n\n        if isinstance(__obj, _context_function_types):\n            if getattr(__obj, 'contextfunction', 0):\n                args = (__self,) + args\n            elif getattr(__obj, 'evalcontextfunction', 0):\n                args = (__self.eval_ctx,) + args\n            elif getattr(__obj, 'environmentfunction', 0):\n                args = (__self.environment,) + args\n        try:\n            return __obj(*args, **kwargs)\n        except StopIteration:\n            return __self.environment.undefined('value was undefined because '\n                                                'a callable raised a '\n                                                'StopIteration exception')\n\n    def derived(self, locals=None):\n        \"\"\"Internal helper function to create a derived context.\"\"\"\n        context = new_context(self.environment, self.name, {},\n                              self.parent, True, None, locals)\n        context.vars.update(self.vars)\n        context.eval_ctx = self.eval_ctx\n        context.blocks.update((k, list(v)) for k, v in iteritems(self.blocks))\n        return context\n\n    def _all(meth):\n        proxy = lambda self: getattr(self.get_all(), meth)()\n        proxy.__doc__ = getattr(dict, meth).__doc__\n        proxy.__name__ = meth\n        return proxy\n\n    keys = _all('keys')\n    values = _all('values')\n    items = _all('items')\n\n    # not available on python 3\n    if PY2:\n        iterkeys = _all('iterkeys')\n        itervalues = _all('itervalues')\n        iteritems = _all('iteritems')\n    del _all\n\n    def __contains__(self, name):\n        return name in self.vars or name in self.parent\n\n    def __getitem__(self, key):\n        \"\"\"Lookup a variable or raise `KeyError` if the variable is\n        undefined.\n        \"\"\"\n        item = self.resolve(key)\n        if isinstance(item, Undefined):\n            raise KeyError(key)\n        return item\n\n    def __repr__(self):\n        return '<%s %s of %r>' % (\n            self.__class__.__name__,\n            repr(self.get_all()),\n            self.name\n        )\n\n\n# register the context as mapping if possible\ntry:\n    from collections import Mapping\n    Mapping.register(Context)\nexcept ImportError:\n    pass\n\n\nclass BlockReference(object):\n    \"\"\"One block on a template reference.\"\"\"\n\n    def __init__(self, name, context, stack, depth):\n        self.name = name\n        self._context = context\n        self._stack = stack\n        self._depth = depth\n\n    @property\n    def super(self):\n        \"\"\"Super the block.\"\"\"\n        if self._depth + 1 >= len(self._stack):\n            return self._context.environment. \\\n                undefined('there is no parent block called %r.' %\n                          self.name, name='super')\n        return BlockReference(self.name, self._context, self._stack,\n                              self._depth + 1)\n\n    @internalcode\n    def __call__(self):\n        rv = concat(self._stack[self._depth](self._context))\n        if self._context.eval_ctx.autoescape:\n            rv = Markup(rv)\n        return rv\n\n\nclass LoopContext(object):\n    \"\"\"A loop context for dynamic iteration.\"\"\"\n\n    def __init__(self, iterable, recurse=None, depth0=0):\n        self._iterator = iter(iterable)\n        self._recurse = recurse\n        self._after = self._safe_next()\n        self.index0 = -1\n        self.depth0 = depth0\n\n        # try to get the length of the iterable early.  This must be done\n        # here because there are some broken iterators around where there\n        # __len__ is the number of iterations left (i'm looking at your\n        # listreverseiterator!).\n        try:\n            self._length = len(iterable)\n        except (TypeError, AttributeError):\n            self._length = None\n\n    def cycle(self, *args):\n        \"\"\"Cycles among the arguments with the current loop index.\"\"\"\n        if not args:\n            raise TypeError('no items for cycling given')\n        return args[self.index0 % len(args)]\n\n    first = property(lambda x: x.index0 == 0)\n    last = property(lambda x: x._after is _last_iteration)\n    index = property(lambda x: x.index0 + 1)\n    revindex = property(lambda x: x.length - x.index0)\n    revindex0 = property(lambda x: x.length - x.index)\n    depth = property(lambda x: x.depth0 + 1)\n\n    def __len__(self):\n        return self.length\n\n    def __iter__(self):\n        return LoopContextIterator(self)\n\n    def _safe_next(self):\n        try:\n            return next(self._iterator)\n        except StopIteration:\n            return _last_iteration\n\n    @internalcode\n    def loop(self, iterable):\n        if self._recurse is None:\n            raise TypeError('Tried to call non recursive loop.  Maybe you '\n                            \"forgot the 'recursive' modifier.\")\n        return self._recurse(iterable, self._recurse, self.depth0 + 1)\n\n    # a nifty trick to enhance the error message if someone tried to call\n    # the the loop without or with too many arguments.\n    __call__ = loop\n    del loop\n\n    @property\n    def length(self):\n        if self._length is None:\n            # if was not possible to get the length of the iterator when\n            # the loop context was created (ie: iterating over a generator)\n            # we have to convert the iterable into a sequence and use the\n            # length of that + the number of iterations so far.\n            iterable = tuple(self._iterator)\n            self._iterator = iter(iterable)\n            iterations_done = self.index0 + 2\n            self._length = len(iterable) + iterations_done\n        return self._length\n\n    def __repr__(self):\n        return '<%s %r/%r>' % (\n            self.__class__.__name__,\n            self.index,\n            self.length\n        )\n\n\n@implements_iterator\nclass LoopContextIterator(object):\n    \"\"\"The iterator for a loop context.\"\"\"\n    __slots__ = ('context',)\n\n    def __init__(self, context):\n        self.context = context\n\n    def __iter__(self):\n        return self\n\n    def __next__(self):\n        ctx = self.context\n        ctx.index0 += 1\n        if ctx._after is _last_iteration:\n            raise StopIteration()\n        next_elem = ctx._after\n        ctx._after = ctx._safe_next()\n        return next_elem, ctx\n\n\nclass Macro(object):\n    \"\"\"Wraps a macro function.\"\"\"\n\n    def __init__(self, environment, func, name, arguments, defaults,\n                 catch_kwargs, catch_varargs, caller):\n        self._environment = environment\n        self._func = func\n        self._argument_count = len(arguments)\n        self.name = name\n        self.arguments = arguments\n        self.defaults = defaults\n        self.catch_kwargs = catch_kwargs\n        self.catch_varargs = catch_varargs\n        self.caller = caller\n\n    @internalcode\n    def __call__(self, *args, **kwargs):\n        # try to consume the positional arguments\n        arguments = list(args[:self._argument_count])\n        off = len(arguments)\n\n        # if the number of arguments consumed is not the number of\n        # arguments expected we start filling in keyword arguments\n        # and defaults.\n        if off != self._argument_count:\n            for idx, name in enumerate(self.arguments[len(arguments):]):\n                try:\n                    value = kwargs.pop(name)\n                except KeyError:\n                    try:\n                        value = self.defaults[idx - self._argument_count + off]\n                    except IndexError:\n                        value = self._environment.undefined(\n                            'parameter %r was not provided' % name, name=name)\n                arguments.append(value)\n\n        # it's important that the order of these arguments does not change\n        # if not also changed in the compiler's `function_scoping` method.\n        # the order is caller, keyword arguments, positional arguments!\n        if self.caller:\n            caller = kwargs.pop('caller', None)\n            if caller is None:\n                caller = self._environment.undefined('No caller defined',\n                                                     name='caller')\n            arguments.append(caller)\n        if self.catch_kwargs:\n            arguments.append(kwargs)\n        elif kwargs:\n            raise TypeError('macro %r takes no keyword argument %r' %\n                            (self.name, next(iter(kwargs))))\n        if self.catch_varargs:\n            arguments.append(args[self._argument_count:])\n        elif len(args) > self._argument_count:\n            raise TypeError('macro %r takes not more than %d argument(s)' %\n                            (self.name, len(self.arguments)))\n        return self._func(*arguments)\n\n    def __repr__(self):\n        return '<%s %s>' % (\n            self.__class__.__name__,\n            self.name is None and 'anonymous' or repr(self.name)\n        )\n\n\n@implements_to_string\nclass Undefined(object):\n    \"\"\"The default undefined type.  This undefined type can be printed and\n    iterated over, but every other access will raise an :exc:`jinja2.exceptions.UndefinedError`:\n\n    >>> foo = Undefined(name='foo')\n    >>> str(foo)\n    ''\n    >>> not foo\n    True\n    >>> foo + 42\n    Traceback (most recent call last):\n      ...\n    jinja2.exceptions.UndefinedError: 'foo' is undefined\n    \"\"\"\n    __slots__ = ('_undefined_hint', '_undefined_obj', '_undefined_name',\n                 '_undefined_exception')\n\n    def __init__(self, hint=None, obj=missing, name=None, exc=UndefinedError):\n        self._undefined_hint = hint\n        self._undefined_obj = obj\n        self._undefined_name = name\n        self._undefined_exception = exc\n\n    @internalcode\n    def _fail_with_undefined_error(self, *args, **kwargs):\n        \"\"\"Regular callback function for undefined objects that raises an\n        `jinja2.exceptions.UndefinedError` on call.\n        \"\"\"\n        if self._undefined_hint is None:\n            if self._undefined_obj is missing:\n                hint = '%r is undefined' % self._undefined_name\n            elif not isinstance(self._undefined_name, string_types):\n                hint = '%s has no element %r' % (\n                    object_type_repr(self._undefined_obj),\n                    self._undefined_name\n                )\n            else:\n                hint = '%r has no attribute %r' % (\n                    object_type_repr(self._undefined_obj),\n                    self._undefined_name\n                )\n        else:\n            hint = self._undefined_hint\n        raise self._undefined_exception(hint)\n\n    @internalcode\n    def __getattr__(self, name):\n        if name[:2] == '__':\n            raise AttributeError(name)\n        return self._fail_with_undefined_error()\n\n    __add__ = __radd__ = __mul__ = __rmul__ = __div__ = __rdiv__ = \\\n        __truediv__ = __rtruediv__ = __floordiv__ = __rfloordiv__ = \\\n        __mod__ = __rmod__ = __pos__ = __neg__ = __call__ = \\\n        __getitem__ = __lt__ = __le__ = __gt__ = __ge__ = __int__ = \\\n        __float__ = __complex__ = __pow__ = __rpow__ = \\\n        _fail_with_undefined_error\n\n    def __eq__(self, other):\n        return type(self) is type(other)\n\n    def __ne__(self, other):\n        return not self.__eq__(other)\n\n    def __hash__(self):\n        return id(type(self))\n\n    def __str__(self):\n        return u''\n\n    def __len__(self):\n        return 0\n\n    def __iter__(self):\n        if 0:\n            yield None\n\n    def __nonzero__(self):\n        return False\n    __bool__ = __nonzero__\n\n    def __repr__(self):\n        return 'Undefined'\n\n\ndef make_logging_undefined(logger=None, base=None):\n    \"\"\"Given a logger object this returns a new undefined class that will\n    log certain failures.  It will log iterations and printing.  If no\n    logger is given a default logger is created.\n\n    Example::\n\n        logger = logging.getLogger(__name__)\n        LoggingUndefined = make_logging_undefined(\n            logger=logger,\n            base=Undefined\n        )\n\n    .. versionadded:: 2.8\n\n    :param logger: the logger to use.  If not provided, a default logger\n                   is created.\n    :param base: the base class to add logging functionality to.  This\n                 defaults to :class:`Undefined`.\n    \"\"\"\n    if logger is None:\n        import logging\n        logger = logging.getLogger(__name__)\n        logger.addHandler(logging.StreamHandler(sys.stderr))\n    if base is None:\n        base = Undefined\n\n    def _log_message(undef):\n        if undef._undefined_hint is None:\n            if undef._undefined_obj is missing:\n                hint = '%s is undefined' % undef._undefined_name\n            elif not isinstance(undef._undefined_name, string_types):\n                hint = '%s has no element %s' % (\n                    object_type_repr(undef._undefined_obj),\n                    undef._undefined_name)\n            else:\n                hint = '%s has no attribute %s' % (\n                    object_type_repr(undef._undefined_obj),\n                    undef._undefined_name)\n        else:\n            hint = undef._undefined_hint\n        logger.warning('Template variable warning: %s', hint)\n\n    class LoggingUndefined(base):\n\n        def _fail_with_undefined_error(self, *args, **kwargs):\n            try:\n                return base._fail_with_undefined_error(self, *args, **kwargs)\n            except self._undefined_exception as e:\n                logger.error('Template variable error: %s', str(e))\n                raise e\n\n        def __str__(self):\n            rv = base.__str__(self)\n            _log_message(self)\n            return rv\n\n        def __iter__(self):\n            rv = base.__iter__(self)\n            _log_message(self)\n            return rv\n\n        if PY2:\n            def __nonzero__(self):\n                rv = base.__nonzero__(self)\n                _log_message(self)\n                return rv\n\n            def __unicode__(self):\n                rv = base.__unicode__(self)\n                _log_message(self)\n                return rv\n        else:\n            def __bool__(self):\n                rv = base.__bool__(self)\n                _log_message(self)\n                return rv\n\n    return LoggingUndefined\n\n\n@implements_to_string\nclass DebugUndefined(Undefined):\n    \"\"\"An undefined that returns the debug info when printed.\n\n    >>> foo = DebugUndefined(name='foo')\n    >>> str(foo)\n    '{{ foo }}'\n    >>> not foo\n    True\n    >>> foo + 42\n    Traceback (most recent call last):\n      ...\n    jinja2.exceptions.UndefinedError: 'foo' is undefined\n    \"\"\"\n    __slots__ = ()\n\n    def __str__(self):\n        if self._undefined_hint is None:\n            if self._undefined_obj is missing:\n                return u'{{ %s }}' % self._undefined_name\n            return '{{ no such element: %s[%r] }}' % (\n                object_type_repr(self._undefined_obj),\n                self._undefined_name\n            )\n        return u'{{ undefined value printed: %s }}' % self._undefined_hint\n\n\n@implements_to_string\nclass StrictUndefined(Undefined):\n    \"\"\"An undefined that barks on print and iteration as well as boolean\n    tests and all kinds of comparisons.  In other words: you can do nothing\n    with it except checking if it's defined using the `defined` test.\n\n    >>> foo = StrictUndefined(name='foo')\n    >>> str(foo)\n    Traceback (most recent call last):\n      ...\n    jinja2.exceptions.UndefinedError: 'foo' is undefined\n    >>> not foo\n    Traceback (most recent call last):\n      ...\n    jinja2.exceptions.UndefinedError: 'foo' is undefined\n    >>> foo + 42\n    Traceback (most recent call last):\n      ...\n    jinja2.exceptions.UndefinedError: 'foo' is undefined\n    \"\"\"\n    __slots__ = ()\n    __iter__ = __str__ = __len__ = __nonzero__ = __eq__ = \\\n        __ne__ = __bool__ = __hash__ = \\\n        Undefined._fail_with_undefined_error\n\n\n# remove remaining slots attributes, after the metaclass did the magic they\n# are unneeded and irritating as they contain wrong data for the subclasses.\ndel Undefined.__slots__, DebugUndefined.__slots__, StrictUndefined.__slots__\n"
  },
  {
    "path": "lib/jinja2/sandbox.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    jinja2.sandbox\n    ~~~~~~~~~~~~~~\n\n    Adds a sandbox layer to Jinja as it was the default behavior in the old\n    Jinja 1 releases.  This sandbox is slightly different from Jinja 1 as the\n    default behavior is easier to use.\n\n    The behavior can be changed by subclassing the environment.\n\n    :copyright: (c) 2010 by the Jinja Team.\n    :license: BSD.\n\"\"\"\nimport types\nimport operator\nfrom jinja2.environment import Environment\nfrom jinja2.exceptions import SecurityError\nfrom jinja2._compat import string_types, PY2\n\n\n#: maximum number of items a range may produce\nMAX_RANGE = 100000\n\n#: attributes of function objects that are considered unsafe.\nif PY2:\n    UNSAFE_FUNCTION_ATTRIBUTES = set(['func_closure', 'func_code', 'func_dict',\n                                      'func_defaults', 'func_globals'])\nelse:\n    # On versions > python 2 the special attributes on functions are gone,\n    # but they remain on methods and generators for whatever reason.\n    UNSAFE_FUNCTION_ATTRIBUTES = set()\n\n\n#: unsafe method attributes.  function attributes are unsafe for methods too\nUNSAFE_METHOD_ATTRIBUTES = set(['im_class', 'im_func', 'im_self'])\n\n#: unsafe generator attirbutes.\nUNSAFE_GENERATOR_ATTRIBUTES = set(['gi_frame', 'gi_code'])\n\nimport warnings\n\n# make sure we don't warn in python 2.6 about stuff we don't care about\nwarnings.filterwarnings('ignore', 'the sets module', DeprecationWarning,\n                        module='jinja2.sandbox')\n\nfrom collections import deque\n\n_mutable_set_types = (set,)\n_mutable_mapping_types = (dict,)\n_mutable_sequence_types = (list,)\n\n\n# on python 2.x we can register the user collection types\ntry:\n    from UserDict import UserDict, DictMixin\n    from UserList import UserList\n    _mutable_mapping_types += (UserDict, DictMixin)\n    _mutable_set_types += (UserList,)\nexcept ImportError:\n    pass\n\n# if sets is still available, register the mutable set from there as well\ntry:\n    from sets import Set\n    _mutable_set_types += (Set,)\nexcept ImportError:\n    pass\n\n#: register Python 2.6 abstract base classes\ntry:\n    from collections import MutableSet, MutableMapping, MutableSequence\n    _mutable_set_types += (MutableSet,)\n    _mutable_mapping_types += (MutableMapping,)\n    _mutable_sequence_types += (MutableSequence,)\nexcept ImportError:\n    pass\n\n_mutable_spec = (\n    (_mutable_set_types, frozenset([\n        'add', 'clear', 'difference_update', 'discard', 'pop', 'remove',\n        'symmetric_difference_update', 'update'\n    ])),\n    (_mutable_mapping_types, frozenset([\n        'clear', 'pop', 'popitem', 'setdefault', 'update'\n    ])),\n    (_mutable_sequence_types, frozenset([\n        'append', 'reverse', 'insert', 'sort', 'extend', 'remove'\n    ])),\n    (deque, frozenset([\n        'append', 'appendleft', 'clear', 'extend', 'extendleft', 'pop',\n        'popleft', 'remove', 'rotate'\n    ]))\n)\n\n\ndef safe_range(*args):\n    \"\"\"A range that can't generate ranges with a length of more than\n    MAX_RANGE items.\n    \"\"\"\n    rng = range(*args)\n    if len(rng) > MAX_RANGE:\n        raise OverflowError('range too big, maximum size for range is %d' %\n                            MAX_RANGE)\n    return rng\n\n\ndef unsafe(f):\n    \"\"\"Marks a function or method as unsafe.\n\n    ::\n\n        @unsafe\n        def delete(self):\n            pass\n    \"\"\"\n    f.unsafe_callable = True\n    return f\n\n\ndef is_internal_attribute(obj, attr):\n    \"\"\"Test if the attribute given is an internal python attribute.  For\n    example this function returns `True` for the `func_code` attribute of\n    python objects.  This is useful if the environment method\n    :meth:`~SandboxedEnvironment.is_safe_attribute` is overridden.\n\n    >>> from jinja2.sandbox import is_internal_attribute\n    >>> is_internal_attribute(str, \"mro\")\n    True\n    >>> is_internal_attribute(str, \"upper\")\n    False\n    \"\"\"\n    if isinstance(obj, types.FunctionType):\n        if attr in UNSAFE_FUNCTION_ATTRIBUTES:\n            return True\n    elif isinstance(obj, types.MethodType):\n        if attr in UNSAFE_FUNCTION_ATTRIBUTES or \\\n           attr in UNSAFE_METHOD_ATTRIBUTES:\n            return True\n    elif isinstance(obj, type):\n        if attr == 'mro':\n            return True\n    elif isinstance(obj, (types.CodeType, types.TracebackType, types.FrameType)):\n        return True\n    elif isinstance(obj, types.GeneratorType):\n        if attr in UNSAFE_GENERATOR_ATTRIBUTES:\n            return True\n    return attr.startswith('__')\n\n\ndef modifies_known_mutable(obj, attr):\n    \"\"\"This function checks if an attribute on a builtin mutable object\n    (list, dict, set or deque) would modify it if called.  It also supports\n    the \"user\"-versions of the objects (`sets.Set`, `UserDict.*` etc.) and\n    with Python 2.6 onwards the abstract base classes `MutableSet`,\n    `MutableMapping`, and `MutableSequence`.\n\n    >>> modifies_known_mutable({}, \"clear\")\n    True\n    >>> modifies_known_mutable({}, \"keys\")\n    False\n    >>> modifies_known_mutable([], \"append\")\n    True\n    >>> modifies_known_mutable([], \"index\")\n    False\n\n    If called with an unsupported object (such as unicode) `False` is\n    returned.\n\n    >>> modifies_known_mutable(\"foo\", \"upper\")\n    False\n    \"\"\"\n    for typespec, unsafe in _mutable_spec:\n        if isinstance(obj, typespec):\n            return attr in unsafe\n    return False\n\n\nclass SandboxedEnvironment(Environment):\n    \"\"\"The sandboxed environment.  It works like the regular environment but\n    tells the compiler to generate sandboxed code.  Additionally subclasses of\n    this environment may override the methods that tell the runtime what\n    attributes or functions are safe to access.\n\n    If the template tries to access insecure code a :exc:`SecurityError` is\n    raised.  However also other exceptions may occour during the rendering so\n    the caller has to ensure that all exceptions are catched.\n    \"\"\"\n    sandboxed = True\n\n    #: default callback table for the binary operators.  A copy of this is\n    #: available on each instance of a sandboxed environment as\n    #: :attr:`binop_table`\n    default_binop_table = {\n        '+':        operator.add,\n        '-':        operator.sub,\n        '*':        operator.mul,\n        '/':        operator.truediv,\n        '//':       operator.floordiv,\n        '**':       operator.pow,\n        '%':        operator.mod\n    }\n\n    #: default callback table for the unary operators.  A copy of this is\n    #: available on each instance of a sandboxed environment as\n    #: :attr:`unop_table`\n    default_unop_table = {\n        '+':        operator.pos,\n        '-':        operator.neg\n    }\n\n    #: a set of binary operators that should be intercepted.  Each operator\n    #: that is added to this set (empty by default) is delegated to the\n    #: :meth:`call_binop` method that will perform the operator.  The default\n    #: operator callback is specified by :attr:`binop_table`.\n    #:\n    #: The following binary operators are interceptable:\n    #: ``//``, ``%``, ``+``, ``*``, ``-``, ``/``, and ``**``\n    #:\n    #: The default operation form the operator table corresponds to the\n    #: builtin function.  Intercepted calls are always slower than the native\n    #: operator call, so make sure only to intercept the ones you are\n    #: interested in.\n    #:\n    #: .. versionadded:: 2.6\n    intercepted_binops = frozenset()\n\n    #: a set of unary operators that should be intercepted.  Each operator\n    #: that is added to this set (empty by default) is delegated to the\n    #: :meth:`call_unop` method that will perform the operator.  The default\n    #: operator callback is specified by :attr:`unop_table`.\n    #:\n    #: The following unary operators are interceptable: ``+``, ``-``\n    #:\n    #: The default operation form the operator table corresponds to the\n    #: builtin function.  Intercepted calls are always slower than the native\n    #: operator call, so make sure only to intercept the ones you are\n    #: interested in.\n    #:\n    #: .. versionadded:: 2.6\n    intercepted_unops = frozenset()\n\n    def intercept_unop(self, operator):\n        \"\"\"Called during template compilation with the name of a unary\n        operator to check if it should be intercepted at runtime.  If this\n        method returns `True`, :meth:`call_unop` is excuted for this unary\n        operator.  The default implementation of :meth:`call_unop` will use\n        the :attr:`unop_table` dictionary to perform the operator with the\n        same logic as the builtin one.\n\n        The following unary operators are interceptable: ``+`` and ``-``\n\n        Intercepted calls are always slower than the native operator call,\n        so make sure only to intercept the ones you are interested in.\n\n        .. versionadded:: 2.6\n        \"\"\"\n        return False\n\n\n    def __init__(self, *args, **kwargs):\n        Environment.__init__(self, *args, **kwargs)\n        self.globals['range'] = safe_range\n        self.binop_table = self.default_binop_table.copy()\n        self.unop_table = self.default_unop_table.copy()\n\n    def is_safe_attribute(self, obj, attr, value):\n        \"\"\"The sandboxed environment will call this method to check if the\n        attribute of an object is safe to access.  Per default all attributes\n        starting with an underscore are considered private as well as the\n        special attributes of internal python objects as returned by the\n        :func:`is_internal_attribute` function.\n        \"\"\"\n        return not (attr.startswith('_') or is_internal_attribute(obj, attr))\n\n    def is_safe_callable(self, obj):\n        \"\"\"Check if an object is safely callable.  Per default a function is\n        considered safe unless the `unsafe_callable` attribute exists and is\n        True.  Override this method to alter the behavior, but this won't\n        affect the `unsafe` decorator from this module.\n        \"\"\"\n        return not (getattr(obj, 'unsafe_callable', False) or\n                    getattr(obj, 'alters_data', False))\n\n    def call_binop(self, context, operator, left, right):\n        \"\"\"For intercepted binary operator calls (:meth:`intercepted_binops`)\n        this function is executed instead of the builtin operator.  This can\n        be used to fine tune the behavior of certain operators.\n\n        .. versionadded:: 2.6\n        \"\"\"\n        return self.binop_table[operator](left, right)\n\n    def call_unop(self, context, operator, arg):\n        \"\"\"For intercepted unary operator calls (:meth:`intercepted_unops`)\n        this function is executed instead of the builtin operator.  This can\n        be used to fine tune the behavior of certain operators.\n\n        .. versionadded:: 2.6\n        \"\"\"\n        return self.unop_table[operator](arg)\n\n    def getitem(self, obj, argument):\n        \"\"\"Subscribe an object from sandboxed code.\"\"\"\n        try:\n            return obj[argument]\n        except (TypeError, LookupError):\n            if isinstance(argument, string_types):\n                try:\n                    attr = str(argument)\n                except Exception:\n                    pass\n                else:\n                    try:\n                        value = getattr(obj, attr)\n                    except AttributeError:\n                        pass\n                    else:\n                        if self.is_safe_attribute(obj, argument, value):\n                            return value\n                        return self.unsafe_undefined(obj, argument)\n        return self.undefined(obj=obj, name=argument)\n\n    def getattr(self, obj, attribute):\n        \"\"\"Subscribe an object from sandboxed code and prefer the\n        attribute.  The attribute passed *must* be a bytestring.\n        \"\"\"\n        try:\n            value = getattr(obj, attribute)\n        except AttributeError:\n            try:\n                return obj[attribute]\n            except (TypeError, LookupError):\n                pass\n        else:\n            if self.is_safe_attribute(obj, attribute, value):\n                return value\n            return self.unsafe_undefined(obj, attribute)\n        return self.undefined(obj=obj, name=attribute)\n\n    def unsafe_undefined(self, obj, attribute):\n        \"\"\"Return an undefined object for unsafe attributes.\"\"\"\n        return self.undefined('access to attribute %r of %r '\n                              'object is unsafe.' % (\n            attribute,\n            obj.__class__.__name__\n        ), name=attribute, obj=obj, exc=SecurityError)\n\n    def call(__self, __context, __obj, *args, **kwargs):\n        \"\"\"Call an object from sandboxed code.\"\"\"\n        # the double prefixes are to avoid double keyword argument\n        # errors when proxying the call.\n        if not __self.is_safe_callable(__obj):\n            raise SecurityError('%r is not safely callable' % (__obj,))\n        return __context.call(__obj, *args, **kwargs)\n\n\nclass ImmutableSandboxedEnvironment(SandboxedEnvironment):\n    \"\"\"Works exactly like the regular `SandboxedEnvironment` but does not\n    permit modifications on the builtin mutable objects `list`, `set`, and\n    `dict` by using the :func:`modifies_known_mutable` function.\n    \"\"\"\n\n    def is_safe_attribute(self, obj, attr, value):\n        if not SandboxedEnvironment.is_safe_attribute(self, obj, attr, value):\n            return False\n        return not modifies_known_mutable(obj, attr)\n"
  },
  {
    "path": "lib/jinja2/tests.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    jinja2.tests\n    ~~~~~~~~~~~~\n\n    Jinja test functions. Used with the \"is\" operator.\n\n    :copyright: (c) 2010 by the Jinja Team.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nimport re\nfrom collections import Mapping\nfrom jinja2.runtime import Undefined\nfrom jinja2._compat import text_type, string_types, integer_types\nimport decimal\n\nnumber_re = re.compile(r'^-?\\d+(\\.\\d+)?$')\nregex_type = type(number_re)\n\n\ntest_callable = callable\n\n\ndef test_odd(value):\n    \"\"\"Return true if the variable is odd.\"\"\"\n    return value % 2 == 1\n\n\ndef test_even(value):\n    \"\"\"Return true if the variable is even.\"\"\"\n    return value % 2 == 0\n\n\ndef test_divisibleby(value, num):\n    \"\"\"Check if a variable is divisible by a number.\"\"\"\n    return value % num == 0\n\n\ndef test_defined(value):\n    \"\"\"Return true if the variable is defined:\n\n    .. sourcecode:: jinja\n\n        {% if variable is defined %}\n            value of variable: {{ variable }}\n        {% else %}\n            variable is not defined\n        {% endif %}\n\n    See the :func:`default` filter for a simple way to set undefined\n    variables.\n    \"\"\"\n    return not isinstance(value, Undefined)\n\n\ndef test_undefined(value):\n    \"\"\"Like :func:`defined` but the other way round.\"\"\"\n    return isinstance(value, Undefined)\n\n\ndef test_none(value):\n    \"\"\"Return true if the variable is none.\"\"\"\n    return value is None\n\n\ndef test_lower(value):\n    \"\"\"Return true if the variable is lowercased.\"\"\"\n    return text_type(value).islower()\n\n\ndef test_upper(value):\n    \"\"\"Return true if the variable is uppercased.\"\"\"\n    return text_type(value).isupper()\n\n\ndef test_string(value):\n    \"\"\"Return true if the object is a string.\"\"\"\n    return isinstance(value, string_types)\n\n\ndef test_mapping(value):\n    \"\"\"Return true if the object is a mapping (dict etc.).\n\n    .. versionadded:: 2.6\n    \"\"\"\n    return isinstance(value, Mapping)\n\n\ndef test_number(value):\n    \"\"\"Return true if the variable is a number.\"\"\"\n    return isinstance(value, integer_types + (float, complex, decimal.Decimal))\n\n\ndef test_sequence(value):\n    \"\"\"Return true if the variable is a sequence. Sequences are variables\n    that are iterable.\n    \"\"\"\n    try:\n        len(value)\n        value.__getitem__\n    except:\n        return False\n    return True\n\n\ndef test_equalto(value, other):\n    \"\"\"Check if an object has the same value as another object:\n\n    .. sourcecode:: jinja\n\n        {% if foo.expression is equalto 42 %}\n            the foo attribute evaluates to the constant 42\n        {% endif %}\n\n    This appears to be a useless test as it does exactly the same as the\n    ``==`` operator, but it can be useful when used together with the\n    `selectattr` function:\n\n    .. sourcecode:: jinja\n\n        {{ users|selectattr(\"email\", \"equalto\", \"foo@bar.invalid\") }}\n\n    .. versionadded:: 2.8\n    \"\"\"\n    return value == other\n\n\ndef test_sameas(value, other):\n    \"\"\"Check if an object points to the same memory address than another\n    object:\n\n    .. sourcecode:: jinja\n\n        {% if foo.attribute is sameas false %}\n            the foo attribute really is the `False` singleton\n        {% endif %}\n    \"\"\"\n    return value is other\n\n\ndef test_iterable(value):\n    \"\"\"Check if it's possible to iterate over an object.\"\"\"\n    try:\n        iter(value)\n    except TypeError:\n        return False\n    return True\n\n\ndef test_escaped(value):\n    \"\"\"Check if the value is escaped.\"\"\"\n    return hasattr(value, '__html__')\n\n\nTESTS = {\n    'odd':              test_odd,\n    'even':             test_even,\n    'divisibleby':      test_divisibleby,\n    'defined':          test_defined,\n    'undefined':        test_undefined,\n    'none':             test_none,\n    'lower':            test_lower,\n    'upper':            test_upper,\n    'string':           test_string,\n    'mapping':          test_mapping,\n    'number':           test_number,\n    'sequence':         test_sequence,\n    'iterable':         test_iterable,\n    'callable':         test_callable,\n    'sameas':           test_sameas,\n    'equalto':          test_equalto,\n    'escaped':          test_escaped\n}\n"
  },
  {
    "path": "lib/jinja2/utils.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    jinja2.utils\n    ~~~~~~~~~~~~\n\n    Utility functions.\n\n    :copyright: (c) 2010 by the Jinja Team.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nimport re\nimport errno\nfrom collections import deque\nfrom threading import Lock\nfrom jinja2._compat import text_type, string_types, implements_iterator, \\\n     url_quote\n\n\n_word_split_re = re.compile(r'(\\s+)')\n_punctuation_re = re.compile(\n    '^(?P<lead>(?:%s)*)(?P<middle>.*?)(?P<trail>(?:%s)*)$' % (\n        '|'.join(map(re.escape, ('(', '<', '&lt;'))),\n        '|'.join(map(re.escape, ('.', ',', ')', '>', '\\n', '&gt;')))\n    )\n)\n_simple_email_re = re.compile(r'^\\S+@[a-zA-Z0-9._-]+\\.[a-zA-Z0-9._-]+$')\n_striptags_re = re.compile(r'(<!--.*?-->|<[^>]*>)')\n_entity_re = re.compile(r'&([^;]+);')\n_letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'\n_digits = '0123456789'\n\n# special singleton representing missing values for the runtime\nmissing = type('MissingType', (), {'__repr__': lambda x: 'missing'})()\n\n# internal code\ninternal_code = set()\n\nconcat = u''.join\n\n\ndef contextfunction(f):\n    \"\"\"This decorator can be used to mark a function or method context callable.\n    A context callable is passed the active :class:`Context` as first argument when\n    called from the template.  This is useful if a function wants to get access\n    to the context or functions provided on the context object.  For example\n    a function that returns a sorted list of template variables the current\n    template exports could look like this::\n\n        @contextfunction\n        def get_exported_names(context):\n            return sorted(context.exported_vars)\n    \"\"\"\n    f.contextfunction = True\n    return f\n\n\ndef evalcontextfunction(f):\n    \"\"\"This decorator can be used to mark a function or method as an eval\n    context callable.  This is similar to the :func:`contextfunction`\n    but instead of passing the context, an evaluation context object is\n    passed.  For more information about the eval context, see\n    :ref:`eval-context`.\n\n    .. versionadded:: 2.4\n    \"\"\"\n    f.evalcontextfunction = True\n    return f\n\n\ndef environmentfunction(f):\n    \"\"\"This decorator can be used to mark a function or method as environment\n    callable.  This decorator works exactly like the :func:`contextfunction`\n    decorator just that the first argument is the active :class:`Environment`\n    and not context.\n    \"\"\"\n    f.environmentfunction = True\n    return f\n\n\ndef internalcode(f):\n    \"\"\"Marks the function as internally used\"\"\"\n    internal_code.add(f.__code__)\n    return f\n\n\ndef is_undefined(obj):\n    \"\"\"Check if the object passed is undefined.  This does nothing more than\n    performing an instance check against :class:`Undefined` but looks nicer.\n    This can be used for custom filters or tests that want to react to\n    undefined variables.  For example a custom default filter can look like\n    this::\n\n        def default(var, default=''):\n            if is_undefined(var):\n                return default\n            return var\n    \"\"\"\n    from jinja2.runtime import Undefined\n    return isinstance(obj, Undefined)\n\n\ndef consume(iterable):\n    \"\"\"Consumes an iterable without doing anything with it.\"\"\"\n    for event in iterable:\n        pass\n\n\ndef clear_caches():\n    \"\"\"Jinja2 keeps internal caches for environments and lexers.  These are\n    used so that Jinja2 doesn't have to recreate environments and lexers all\n    the time.  Normally you don't have to care about that but if you are\n    messuring memory consumption you may want to clean the caches.\n    \"\"\"\n    from jinja2.environment import _spontaneous_environments\n    from jinja2.lexer import _lexer_cache\n    _spontaneous_environments.clear()\n    _lexer_cache.clear()\n\n\ndef import_string(import_name, silent=False):\n    \"\"\"Imports an object based on a string.  This is useful if you want to\n    use import paths as endpoints or something similar.  An import path can\n    be specified either in dotted notation (``xml.sax.saxutils.escape``)\n    or with a colon as object delimiter (``xml.sax.saxutils:escape``).\n\n    If the `silent` is True the return value will be `None` if the import\n    fails.\n\n    :return: imported object\n    \"\"\"\n    try:\n        if ':' in import_name:\n            module, obj = import_name.split(':', 1)\n        elif '.' in import_name:\n            items = import_name.split('.')\n            module = '.'.join(items[:-1])\n            obj = items[-1]\n        else:\n            return __import__(import_name)\n        return getattr(__import__(module, None, None, [obj]), obj)\n    except (ImportError, AttributeError):\n        if not silent:\n            raise\n\n\ndef open_if_exists(filename, mode='rb'):\n    \"\"\"Returns a file descriptor for the filename if that file exists,\n    otherwise `None`.\n    \"\"\"\n    try:\n        return open(filename, mode)\n    except IOError as e:\n        if e.errno not in (errno.ENOENT, errno.EISDIR, errno.EINVAL):\n            raise\n\n\ndef object_type_repr(obj):\n    \"\"\"Returns the name of the object's type.  For some recognized\n    singletons the name of the object is returned instead. (For\n    example for `None` and `Ellipsis`).\n    \"\"\"\n    if obj is None:\n        return 'None'\n    elif obj is Ellipsis:\n        return 'Ellipsis'\n    # __builtin__ in 2.x, builtins in 3.x\n    if obj.__class__.__module__ in ('__builtin__', 'builtins'):\n        name = obj.__class__.__name__\n    else:\n        name = obj.__class__.__module__ + '.' + obj.__class__.__name__\n    return '%s object' % name\n\n\ndef pformat(obj, verbose=False):\n    \"\"\"Prettyprint an object.  Either use the `pretty` library or the\n    builtin `pprint`.\n    \"\"\"\n    try:\n        from pretty import pretty\n        return pretty(obj, verbose=verbose)\n    except ImportError:\n        from pprint import pformat\n        return pformat(obj)\n\n\ndef urlize(text, trim_url_limit=None, nofollow=False, target=None):\n    \"\"\"Converts any URLs in text into clickable links. Works on http://,\n    https:// and www. links. Links can have trailing punctuation (periods,\n    commas, close-parens) and leading punctuation (opening parens) and\n    it'll still do the right thing.\n\n    If trim_url_limit is not None, the URLs in link text will be limited\n    to trim_url_limit characters.\n\n    If nofollow is True, the URLs in link text will get a rel=\"nofollow\"\n    attribute.\n\n    If target is not None, a target attribute will be added to the link.\n    \"\"\"\n    trim_url = lambda x, limit=trim_url_limit: limit is not None \\\n                         and (x[:limit] + (len(x) >=limit and '...'\n                         or '')) or x\n    words = _word_split_re.split(text_type(escape(text)))\n    nofollow_attr = nofollow and ' rel=\"nofollow\"' or ''\n    if target is not None and isinstance(target, string_types):\n        target_attr = ' target=\"%s\"' % target\n    else:\n        target_attr = ''\n    for i, word in enumerate(words):\n        match = _punctuation_re.match(word)\n        if match:\n            lead, middle, trail = match.groups()\n            if middle.startswith('www.') or (\n                '@' not in middle and\n                not middle.startswith('http://') and\n                not middle.startswith('https://') and\n                len(middle) > 0 and\n                middle[0] in _letters + _digits and (\n                    middle.endswith('.org') or\n                    middle.endswith('.net') or\n                    middle.endswith('.com')\n                )):\n                middle = '<a href=\"http://%s\"%s%s>%s</a>' % (middle,\n                    nofollow_attr, target_attr, trim_url(middle))\n            if middle.startswith('http://') or \\\n               middle.startswith('https://'):\n                middle = '<a href=\"%s\"%s%s>%s</a>' % (middle,\n                    nofollow_attr, target_attr, trim_url(middle))\n            if '@' in middle and not middle.startswith('www.') and \\\n               not ':' in middle and _simple_email_re.match(middle):\n                middle = '<a href=\"mailto:%s\">%s</a>' % (middle, middle)\n            if lead + middle + trail != word:\n                words[i] = lead + middle + trail\n    return u''.join(words)\n\n\ndef generate_lorem_ipsum(n=5, html=True, min=20, max=100):\n    \"\"\"Generate some lorem ipsum for the template.\"\"\"\n    from jinja2.constants import LOREM_IPSUM_WORDS\n    from random import choice, randrange\n    words = LOREM_IPSUM_WORDS.split()\n    result = []\n\n    for _ in range(n):\n        next_capitalized = True\n        last_comma = last_fullstop = 0\n        word = None\n        last = None\n        p = []\n\n        # each paragraph contains out of 20 to 100 words.\n        for idx, _ in enumerate(range(randrange(min, max))):\n            while True:\n                word = choice(words)\n                if word != last:\n                    last = word\n                    break\n            if next_capitalized:\n                word = word.capitalize()\n                next_capitalized = False\n            # add commas\n            if idx - randrange(3, 8) > last_comma:\n                last_comma = idx\n                last_fullstop += 2\n                word += ','\n            # add end of sentences\n            if idx - randrange(10, 20) > last_fullstop:\n                last_comma = last_fullstop = idx\n                word += '.'\n                next_capitalized = True\n            p.append(word)\n\n        # ensure that the paragraph ends with a dot.\n        p = u' '.join(p)\n        if p.endswith(','):\n            p = p[:-1] + '.'\n        elif not p.endswith('.'):\n            p += '.'\n        result.append(p)\n\n    if not html:\n        return u'\\n\\n'.join(result)\n    return Markup(u'\\n'.join(u'<p>%s</p>' % escape(x) for x in result))\n\n\ndef unicode_urlencode(obj, charset='utf-8', for_qs=False):\n    \"\"\"URL escapes a single bytestring or unicode string with the\n    given charset if applicable to URL safe quoting under all rules\n    that need to be considered under all supported Python versions.\n\n    If non strings are provided they are converted to their unicode\n    representation first.\n    \"\"\"\n    if not isinstance(obj, string_types):\n        obj = text_type(obj)\n    if isinstance(obj, text_type):\n        obj = obj.encode(charset)\n    safe = for_qs and b'' or b'/'\n    rv = text_type(url_quote(obj, safe))\n    if for_qs:\n        rv = rv.replace('%20', '+')\n    return rv\n\n\nclass LRUCache(object):\n    \"\"\"A simple LRU Cache implementation.\"\"\"\n\n    # this is fast for small capacities (something below 1000) but doesn't\n    # scale.  But as long as it's only used as storage for templates this\n    # won't do any harm.\n\n    def __init__(self, capacity):\n        self.capacity = capacity\n        self._mapping = {}\n        self._queue = deque()\n        self._postinit()\n\n    def _postinit(self):\n        # alias all queue methods for faster lookup\n        self._popleft = self._queue.popleft\n        self._pop = self._queue.pop\n        self._remove = self._queue.remove\n        self._wlock = Lock()\n        self._append = self._queue.append\n\n    def __getstate__(self):\n        return {\n            'capacity':     self.capacity,\n            '_mapping':     self._mapping,\n            '_queue':       self._queue\n        }\n\n    def __setstate__(self, d):\n        self.__dict__.update(d)\n        self._postinit()\n\n    def __getnewargs__(self):\n        return (self.capacity,)\n\n    def copy(self):\n        \"\"\"Return a shallow copy of the instance.\"\"\"\n        rv = self.__class__(self.capacity)\n        rv._mapping.update(self._mapping)\n        rv._queue = deque(self._queue)\n        return rv\n\n    def get(self, key, default=None):\n        \"\"\"Return an item from the cache dict or `default`\"\"\"\n        try:\n            return self[key]\n        except KeyError:\n            return default\n\n    def setdefault(self, key, default=None):\n        \"\"\"Set `default` if the key is not in the cache otherwise\n        leave unchanged. Return the value of this key.\n        \"\"\"\n        self._wlock.acquire()\n        try:\n            try:\n                return self[key]\n            except KeyError:\n                self[key] = default\n                return default\n        finally:\n            self._wlock.release()\n\n    def clear(self):\n        \"\"\"Clear the cache.\"\"\"\n        self._wlock.acquire()\n        try:\n            self._mapping.clear()\n            self._queue.clear()\n        finally:\n            self._wlock.release()\n\n    def __contains__(self, key):\n        \"\"\"Check if a key exists in this cache.\"\"\"\n        return key in self._mapping\n\n    def __len__(self):\n        \"\"\"Return the current size of the cache.\"\"\"\n        return len(self._mapping)\n\n    def __repr__(self):\n        return '<%s %r>' % (\n            self.__class__.__name__,\n            self._mapping\n        )\n\n    def __getitem__(self, key):\n        \"\"\"Get an item from the cache. Moves the item up so that it has the\n        highest priority then.\n\n        Raise a `KeyError` if it does not exist.\n        \"\"\"\n        self._wlock.acquire()\n        try:\n            rv = self._mapping[key]\n            if self._queue[-1] != key:\n                try:\n                    self._remove(key)\n                except ValueError:\n                    # if something removed the key from the container\n                    # when we read, ignore the ValueError that we would\n                    # get otherwise.\n                    pass\n                self._append(key)\n            return rv\n        finally:\n            self._wlock.release()\n\n    def __setitem__(self, key, value):\n        \"\"\"Sets the value for an item. Moves the item up so that it\n        has the highest priority then.\n        \"\"\"\n        self._wlock.acquire()\n        try:\n            if key in self._mapping:\n                self._remove(key)\n            elif len(self._mapping) == self.capacity:\n                del self._mapping[self._popleft()]\n            self._append(key)\n            self._mapping[key] = value\n        finally:\n            self._wlock.release()\n\n    def __delitem__(self, key):\n        \"\"\"Remove an item from the cache dict.\n        Raise a `KeyError` if it does not exist.\n        \"\"\"\n        self._wlock.acquire()\n        try:\n            del self._mapping[key]\n            try:\n                self._remove(key)\n            except ValueError:\n                # __getitem__ is not locked, it might happen\n                pass\n        finally:\n            self._wlock.release()\n\n    def items(self):\n        \"\"\"Return a list of items.\"\"\"\n        result = [(key, self._mapping[key]) for key in list(self._queue)]\n        result.reverse()\n        return result\n\n    def iteritems(self):\n        \"\"\"Iterate over all items.\"\"\"\n        return iter(self.items())\n\n    def values(self):\n        \"\"\"Return a list of all values.\"\"\"\n        return [x[1] for x in self.items()]\n\n    def itervalue(self):\n        \"\"\"Iterate over all values.\"\"\"\n        return iter(self.values())\n\n    def keys(self):\n        \"\"\"Return a list of all keys ordered by most recent usage.\"\"\"\n        return list(self)\n\n    def iterkeys(self):\n        \"\"\"Iterate over all keys in the cache dict, ordered by\n        the most recent usage.\n        \"\"\"\n        return reversed(tuple(self._queue))\n\n    __iter__ = iterkeys\n\n    def __reversed__(self):\n        \"\"\"Iterate over the values in the cache dict, oldest items\n        coming first.\n        \"\"\"\n        return iter(tuple(self._queue))\n\n    __copy__ = copy\n\n\n# register the LRU cache as mutable mapping if possible\ntry:\n    from collections import MutableMapping\n    MutableMapping.register(LRUCache)\nexcept ImportError:\n    pass\n\n\n@implements_iterator\nclass Cycler(object):\n    \"\"\"A cycle helper for templates.\"\"\"\n\n    def __init__(self, *items):\n        if not items:\n            raise RuntimeError('at least one item has to be provided')\n        self.items = items\n        self.reset()\n\n    def reset(self):\n        \"\"\"Resets the cycle.\"\"\"\n        self.pos = 0\n\n    @property\n    def current(self):\n        \"\"\"Returns the current item.\"\"\"\n        return self.items[self.pos]\n\n    def __next__(self):\n        \"\"\"Goes one item ahead and returns it.\"\"\"\n        rv = self.current\n        self.pos = (self.pos + 1) % len(self.items)\n        return rv\n\n\nclass Joiner(object):\n    \"\"\"A joining helper for templates.\"\"\"\n\n    def __init__(self, sep=u', '):\n        self.sep = sep\n        self.used = False\n\n    def __call__(self):\n        if not self.used:\n            self.used = True\n            return u''\n        return self.sep\n\n\n# Imported here because that's where it was in the past\nfrom markupsafe import Markup, escape, soft_unicode\n"
  },
  {
    "path": "lib/jinja2/visitor.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    jinja2.visitor\n    ~~~~~~~~~~~~~~\n\n    This module implements a visitor for the nodes.\n\n    :copyright: (c) 2010 by the Jinja Team.\n    :license: BSD.\n\"\"\"\nfrom jinja2.nodes import Node\n\n\nclass NodeVisitor(object):\n    \"\"\"Walks the abstract syntax tree and call visitor functions for every\n    node found.  The visitor functions may return values which will be\n    forwarded by the `visit` method.\n\n    Per default the visitor functions for the nodes are ``'visit_'`` +\n    class name of the node.  So a `TryFinally` node visit function would\n    be `visit_TryFinally`.  This behavior can be changed by overriding\n    the `get_visitor` function.  If no visitor function exists for a node\n    (return value `None`) the `generic_visit` visitor is used instead.\n    \"\"\"\n\n    def get_visitor(self, node):\n        \"\"\"Return the visitor function for this node or `None` if no visitor\n        exists for this node.  In that case the generic visit function is\n        used instead.\n        \"\"\"\n        method = 'visit_' + node.__class__.__name__\n        return getattr(self, method, None)\n\n    def visit(self, node, *args, **kwargs):\n        \"\"\"Visit a node.\"\"\"\n        f = self.get_visitor(node)\n        if f is not None:\n            return f(node, *args, **kwargs)\n        return self.generic_visit(node, *args, **kwargs)\n\n    def generic_visit(self, node, *args, **kwargs):\n        \"\"\"Called if no explicit visitor function exists for a node.\"\"\"\n        for node in node.iter_child_nodes():\n            self.visit(node, *args, **kwargs)\n\n\nclass NodeTransformer(NodeVisitor):\n    \"\"\"Walks the abstract syntax tree and allows modifications of nodes.\n\n    The `NodeTransformer` will walk the AST and use the return value of the\n    visitor functions to replace or remove the old node.  If the return\n    value of the visitor function is `None` the node will be removed\n    from the previous location otherwise it's replaced with the return\n    value.  The return value may be the original node in which case no\n    replacement takes place.\n    \"\"\"\n\n    def generic_visit(self, node, *args, **kwargs):\n        for field, old_value in node.iter_fields():\n            if isinstance(old_value, list):\n                new_values = []\n                for value in old_value:\n                    if isinstance(value, Node):\n                        value = self.visit(value, *args, **kwargs)\n                        if value is None:\n                            continue\n                        elif not isinstance(value, Node):\n                            new_values.extend(value)\n                            continue\n                    new_values.append(value)\n                old_value[:] = new_values\n            elif isinstance(old_value, Node):\n                new_node = self.visit(old_value, *args, **kwargs)\n                if new_node is None:\n                    delattr(node, field)\n                else:\n                    setattr(node, field, new_node)\n        return node\n\n    def visit_list(self, node, *args, **kwargs):\n        \"\"\"As transformers may return lists in some places this method\n        can be used to enforce a list as return value.\n        \"\"\"\n        rv = self.visit(node, *args, **kwargs)\n        if not isinstance(rv, list):\n            rv = [rv]\n        return rv\n"
  },
  {
    "path": "lib/markupsafe/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    markupsafe\n    ~~~~~~~~~~\n\n    Implements a Markup string.\n\n    :copyright: (c) 2010 by Armin Ronacher.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nimport re\nimport string\nfrom collections import Mapping\nfrom markupsafe._compat import text_type, string_types, int_types, \\\n     unichr, iteritems, PY2\n\n\n__all__ = ['Markup', 'soft_unicode', 'escape', 'escape_silent']\n\n\n_striptags_re = re.compile(r'(<!--.*?-->|<[^>]*>)')\n_entity_re = re.compile(r'&([^;]+);')\n\n\nclass Markup(text_type):\n    r\"\"\"Marks a string as being safe for inclusion in HTML/XML output without\n    needing to be escaped.  This implements the `__html__` interface a couple\n    of frameworks and web applications use.  :class:`Markup` is a direct\n    subclass of `unicode` and provides all the methods of `unicode` just that\n    it escapes arguments passed and always returns `Markup`.\n\n    The `escape` function returns markup objects so that double escaping can't\n    happen.\n\n    The constructor of the :class:`Markup` class can be used for three\n    different things:  When passed an unicode object it's assumed to be safe,\n    when passed an object with an HTML representation (has an `__html__`\n    method) that representation is used, otherwise the object passed is\n    converted into a unicode string and then assumed to be safe:\n\n    >>> Markup(\"Hello <em>World</em>!\")\n    Markup(u'Hello <em>World</em>!')\n    >>> class Foo(object):\n    ...  def __html__(self):\n    ...   return '<a href=\"#\">foo</a>'\n    ...\n    >>> Markup(Foo())\n    Markup(u'<a href=\"#\">foo</a>')\n\n    If you want object passed being always treated as unsafe you can use the\n    :meth:`escape` classmethod to create a :class:`Markup` object:\n\n    >>> Markup.escape(\"Hello <em>World</em>!\")\n    Markup(u'Hello &lt;em&gt;World&lt;/em&gt;!')\n\n    Operations on a markup string are markup aware which means that all\n    arguments are passed through the :func:`escape` function:\n\n    >>> em = Markup(\"<em>%s</em>\")\n    >>> em % \"foo & bar\"\n    Markup(u'<em>foo &amp; bar</em>')\n    >>> strong = Markup(\"<strong>%(text)s</strong>\")\n    >>> strong % {'text': '<blink>hacker here</blink>'}\n    Markup(u'<strong>&lt;blink&gt;hacker here&lt;/blink&gt;</strong>')\n    >>> Markup(\"<em>Hello</em> \") + \"<foo>\"\n    Markup(u'<em>Hello</em> &lt;foo&gt;')\n    \"\"\"\n    __slots__ = ()\n\n    def __new__(cls, base=u'', encoding=None, errors='strict'):\n        if hasattr(base, '__html__'):\n            base = base.__html__()\n        if encoding is None:\n            return text_type.__new__(cls, base)\n        return text_type.__new__(cls, base, encoding, errors)\n\n    def __html__(self):\n        return self\n\n    def __add__(self, other):\n        if isinstance(other, string_types) or hasattr(other, '__html__'):\n            return self.__class__(super(Markup, self).__add__(self.escape(other)))\n        return NotImplemented\n\n    def __radd__(self, other):\n        if hasattr(other, '__html__') or isinstance(other, string_types):\n            return self.escape(other).__add__(self)\n        return NotImplemented\n\n    def __mul__(self, num):\n        if isinstance(num, int_types):\n            return self.__class__(text_type.__mul__(self, num))\n        return NotImplemented\n    __rmul__ = __mul__\n\n    def __mod__(self, arg):\n        if isinstance(arg, tuple):\n            arg = tuple(_MarkupEscapeHelper(x, self.escape) for x in arg)\n        else:\n            arg = _MarkupEscapeHelper(arg, self.escape)\n        return self.__class__(text_type.__mod__(self, arg))\n\n    def __repr__(self):\n        return '%s(%s)' % (\n            self.__class__.__name__,\n            text_type.__repr__(self)\n        )\n\n    def join(self, seq):\n        return self.__class__(text_type.join(self, map(self.escape, seq)))\n    join.__doc__ = text_type.join.__doc__\n\n    def split(self, *args, **kwargs):\n        return list(map(self.__class__, text_type.split(self, *args, **kwargs)))\n    split.__doc__ = text_type.split.__doc__\n\n    def rsplit(self, *args, **kwargs):\n        return list(map(self.__class__, text_type.rsplit(self, *args, **kwargs)))\n    rsplit.__doc__ = text_type.rsplit.__doc__\n\n    def splitlines(self, *args, **kwargs):\n        return list(map(self.__class__, text_type.splitlines(\n            self, *args, **kwargs)))\n    splitlines.__doc__ = text_type.splitlines.__doc__\n\n    def unescape(self):\n        r\"\"\"Unescape markup again into an text_type string.  This also resolves\n        known HTML4 and XHTML entities:\n\n        >>> Markup(\"Main &raquo; <em>About</em>\").unescape()\n        u'Main \\xbb <em>About</em>'\n        \"\"\"\n        from markupsafe._constants import HTML_ENTITIES\n        def handle_match(m):\n            name = m.group(1)\n            if name in HTML_ENTITIES:\n                return unichr(HTML_ENTITIES[name])\n            try:\n                if name[:2] in ('#x', '#X'):\n                    return unichr(int(name[2:], 16))\n                elif name.startswith('#'):\n                    return unichr(int(name[1:]))\n            except ValueError:\n                pass\n            return u''\n        return _entity_re.sub(handle_match, text_type(self))\n\n    def striptags(self):\n        r\"\"\"Unescape markup into an text_type string and strip all tags.  This\n        also resolves known HTML4 and XHTML entities.  Whitespace is\n        normalized to one:\n\n        >>> Markup(\"Main &raquo;  <em>About</em>\").striptags()\n        u'Main \\xbb About'\n        \"\"\"\n        stripped = u' '.join(_striptags_re.sub('', self).split())\n        return Markup(stripped).unescape()\n\n    @classmethod\n    def escape(cls, s):\n        \"\"\"Escape the string.  Works like :func:`escape` with the difference\n        that for subclasses of :class:`Markup` this function would return the\n        correct subclass.\n        \"\"\"\n        rv = escape(s)\n        if rv.__class__ is not cls:\n            return cls(rv)\n        return rv\n\n    def make_simple_escaping_wrapper(name):\n        orig = getattr(text_type, name)\n        def func(self, *args, **kwargs):\n            args = _escape_argspec(list(args), enumerate(args), self.escape)\n            _escape_argspec(kwargs, iteritems(kwargs), self.escape)\n            return self.__class__(orig(self, *args, **kwargs))\n        func.__name__ = orig.__name__\n        func.__doc__ = orig.__doc__\n        return func\n\n    for method in '__getitem__', 'capitalize', \\\n                  'title', 'lower', 'upper', 'replace', 'ljust', \\\n                  'rjust', 'lstrip', 'rstrip', 'center', 'strip', \\\n                  'translate', 'expandtabs', 'swapcase', 'zfill':\n        locals()[method] = make_simple_escaping_wrapper(method)\n\n    # new in python 2.5\n    if hasattr(text_type, 'partition'):\n        def partition(self, sep):\n            return tuple(map(self.__class__,\n                             text_type.partition(self, self.escape(sep))))\n        def rpartition(self, sep):\n            return tuple(map(self.__class__,\n                             text_type.rpartition(self, self.escape(sep))))\n\n    # new in python 2.6\n    if hasattr(text_type, 'format'):\n        def format(*args, **kwargs):\n            self, args = args[0], args[1:]\n            formatter = EscapeFormatter(self.escape)\n            kwargs = _MagicFormatMapping(args, kwargs)\n            return self.__class__(formatter.vformat(self, args, kwargs))\n\n        def __html_format__(self, format_spec):\n            if format_spec:\n                raise ValueError('Unsupported format specification '\n                                 'for Markup.')\n            return self\n\n    # not in python 3\n    if hasattr(text_type, '__getslice__'):\n        __getslice__ = make_simple_escaping_wrapper('__getslice__')\n\n    del method, make_simple_escaping_wrapper\n\n\nclass _MagicFormatMapping(Mapping):\n    \"\"\"This class implements a dummy wrapper to fix a bug in the Python\n    standard library for string formatting.\n\n    See http://bugs.python.org/issue13598 for information about why\n    this is necessary.\n    \"\"\"\n\n    def __init__(self, args, kwargs):\n        self._args = args\n        self._kwargs = kwargs\n        self._last_index = 0\n\n    def __getitem__(self, key):\n        if key == '':\n            idx = self._last_index\n            self._last_index += 1\n            try:\n                return self._args[idx]\n            except LookupError:\n                pass\n            key = str(idx)\n        return self._kwargs[key]\n\n    def __iter__(self):\n        return iter(self._kwargs)\n\n    def __len__(self):\n        return len(self._kwargs)\n\n\nif hasattr(text_type, 'format'):\n    class EscapeFormatter(string.Formatter):\n\n        def __init__(self, escape):\n            self.escape = escape\n\n        def format_field(self, value, format_spec):\n            if hasattr(value, '__html_format__'):\n                rv = value.__html_format__(format_spec)\n            elif hasattr(value, '__html__'):\n                if format_spec:\n                    raise ValueError('No format specification allowed '\n                                     'when formatting an object with '\n                                     'its __html__ method.')\n                rv = value.__html__()\n            else:\n                rv = string.Formatter.format_field(self, value, format_spec)\n            return text_type(self.escape(rv))\n\n\ndef _escape_argspec(obj, iterable, escape):\n    \"\"\"Helper for various string-wrapped functions.\"\"\"\n    for key, value in iterable:\n        if hasattr(value, '__html__') or isinstance(value, string_types):\n            obj[key] = escape(value)\n    return obj\n\n\nclass _MarkupEscapeHelper(object):\n    \"\"\"Helper for Markup.__mod__\"\"\"\n\n    def __init__(self, obj, escape):\n        self.obj = obj\n        self.escape = escape\n\n    __getitem__ = lambda s, x: _MarkupEscapeHelper(s.obj[x], s.escape)\n    __unicode__ = __str__ = lambda s: text_type(s.escape(s.obj))\n    __repr__ = lambda s: str(s.escape(repr(s.obj)))\n    __int__ = lambda s: int(s.obj)\n    __float__ = lambda s: float(s.obj)\n\n\n# we have to import it down here as the speedups and native\n# modules imports the markup type which is define above.\ntry:\n    from markupsafe._speedups import escape, escape_silent, soft_unicode\nexcept ImportError:\n    from markupsafe._native import escape, escape_silent, soft_unicode\n\nif not PY2:\n    soft_str = soft_unicode\n    __all__.append('soft_str')\n"
  },
  {
    "path": "lib/markupsafe/_compat.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    markupsafe._compat\n    ~~~~~~~~~~~~~~~~~~\n\n    Compatibility module for different Python versions.\n\n    :copyright: (c) 2013 by Armin Ronacher.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nimport sys\n\nPY2 = sys.version_info[0] == 2\n\nif not PY2:\n    text_type = str\n    string_types = (str,)\n    unichr = chr\n    int_types = (int,)\n    iteritems = lambda x: iter(x.items())\nelse:\n    text_type = unicode\n    string_types = (str, unicode)\n    unichr = unichr\n    int_types = (int, long)\n    iteritems = lambda x: x.iteritems()\n"
  },
  {
    "path": "lib/markupsafe/_constants.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    markupsafe._constants\n    ~~~~~~~~~~~~~~~~~~~~~\n\n    Highlevel implementation of the Markup string.\n\n    :copyright: (c) 2010 by Armin Ronacher.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\n\n\nHTML_ENTITIES = {\n    'AElig': 198,\n    'Aacute': 193,\n    'Acirc': 194,\n    'Agrave': 192,\n    'Alpha': 913,\n    'Aring': 197,\n    'Atilde': 195,\n    'Auml': 196,\n    'Beta': 914,\n    'Ccedil': 199,\n    'Chi': 935,\n    'Dagger': 8225,\n    'Delta': 916,\n    'ETH': 208,\n    'Eacute': 201,\n    'Ecirc': 202,\n    'Egrave': 200,\n    'Epsilon': 917,\n    'Eta': 919,\n    'Euml': 203,\n    'Gamma': 915,\n    'Iacute': 205,\n    'Icirc': 206,\n    'Igrave': 204,\n    'Iota': 921,\n    'Iuml': 207,\n    'Kappa': 922,\n    'Lambda': 923,\n    'Mu': 924,\n    'Ntilde': 209,\n    'Nu': 925,\n    'OElig': 338,\n    'Oacute': 211,\n    'Ocirc': 212,\n    'Ograve': 210,\n    'Omega': 937,\n    'Omicron': 927,\n    'Oslash': 216,\n    'Otilde': 213,\n    'Ouml': 214,\n    'Phi': 934,\n    'Pi': 928,\n    'Prime': 8243,\n    'Psi': 936,\n    'Rho': 929,\n    'Scaron': 352,\n    'Sigma': 931,\n    'THORN': 222,\n    'Tau': 932,\n    'Theta': 920,\n    'Uacute': 218,\n    'Ucirc': 219,\n    'Ugrave': 217,\n    'Upsilon': 933,\n    'Uuml': 220,\n    'Xi': 926,\n    'Yacute': 221,\n    'Yuml': 376,\n    'Zeta': 918,\n    'aacute': 225,\n    'acirc': 226,\n    'acute': 180,\n    'aelig': 230,\n    'agrave': 224,\n    'alefsym': 8501,\n    'alpha': 945,\n    'amp': 38,\n    'and': 8743,\n    'ang': 8736,\n    'apos': 39,\n    'aring': 229,\n    'asymp': 8776,\n    'atilde': 227,\n    'auml': 228,\n    'bdquo': 8222,\n    'beta': 946,\n    'brvbar': 166,\n    'bull': 8226,\n    'cap': 8745,\n    'ccedil': 231,\n    'cedil': 184,\n    'cent': 162,\n    'chi': 967,\n    'circ': 710,\n    'clubs': 9827,\n    'cong': 8773,\n    'copy': 169,\n    'crarr': 8629,\n    'cup': 8746,\n    'curren': 164,\n    'dArr': 8659,\n    'dagger': 8224,\n    'darr': 8595,\n    'deg': 176,\n    'delta': 948,\n    'diams': 9830,\n    'divide': 247,\n    'eacute': 233,\n    'ecirc': 234,\n    'egrave': 232,\n    'empty': 8709,\n    'emsp': 8195,\n    'ensp': 8194,\n    'epsilon': 949,\n    'equiv': 8801,\n    'eta': 951,\n    'eth': 240,\n    'euml': 235,\n    'euro': 8364,\n    'exist': 8707,\n    'fnof': 402,\n    'forall': 8704,\n    'frac12': 189,\n    'frac14': 188,\n    'frac34': 190,\n    'frasl': 8260,\n    'gamma': 947,\n    'ge': 8805,\n    'gt': 62,\n    'hArr': 8660,\n    'harr': 8596,\n    'hearts': 9829,\n    'hellip': 8230,\n    'iacute': 237,\n    'icirc': 238,\n    'iexcl': 161,\n    'igrave': 236,\n    'image': 8465,\n    'infin': 8734,\n    'int': 8747,\n    'iota': 953,\n    'iquest': 191,\n    'isin': 8712,\n    'iuml': 239,\n    'kappa': 954,\n    'lArr': 8656,\n    'lambda': 955,\n    'lang': 9001,\n    'laquo': 171,\n    'larr': 8592,\n    'lceil': 8968,\n    'ldquo': 8220,\n    'le': 8804,\n    'lfloor': 8970,\n    'lowast': 8727,\n    'loz': 9674,\n    'lrm': 8206,\n    'lsaquo': 8249,\n    'lsquo': 8216,\n    'lt': 60,\n    'macr': 175,\n    'mdash': 8212,\n    'micro': 181,\n    'middot': 183,\n    'minus': 8722,\n    'mu': 956,\n    'nabla': 8711,\n    'nbsp': 160,\n    'ndash': 8211,\n    'ne': 8800,\n    'ni': 8715,\n    'not': 172,\n    'notin': 8713,\n    'nsub': 8836,\n    'ntilde': 241,\n    'nu': 957,\n    'oacute': 243,\n    'ocirc': 244,\n    'oelig': 339,\n    'ograve': 242,\n    'oline': 8254,\n    'omega': 969,\n    'omicron': 959,\n    'oplus': 8853,\n    'or': 8744,\n    'ordf': 170,\n    'ordm': 186,\n    'oslash': 248,\n    'otilde': 245,\n    'otimes': 8855,\n    'ouml': 246,\n    'para': 182,\n    'part': 8706,\n    'permil': 8240,\n    'perp': 8869,\n    'phi': 966,\n    'pi': 960,\n    'piv': 982,\n    'plusmn': 177,\n    'pound': 163,\n    'prime': 8242,\n    'prod': 8719,\n    'prop': 8733,\n    'psi': 968,\n    'quot': 34,\n    'rArr': 8658,\n    'radic': 8730,\n    'rang': 9002,\n    'raquo': 187,\n    'rarr': 8594,\n    'rceil': 8969,\n    'rdquo': 8221,\n    'real': 8476,\n    'reg': 174,\n    'rfloor': 8971,\n    'rho': 961,\n    'rlm': 8207,\n    'rsaquo': 8250,\n    'rsquo': 8217,\n    'sbquo': 8218,\n    'scaron': 353,\n    'sdot': 8901,\n    'sect': 167,\n    'shy': 173,\n    'sigma': 963,\n    'sigmaf': 962,\n    'sim': 8764,\n    'spades': 9824,\n    'sub': 8834,\n    'sube': 8838,\n    'sum': 8721,\n    'sup': 8835,\n    'sup1': 185,\n    'sup2': 178,\n    'sup3': 179,\n    'supe': 8839,\n    'szlig': 223,\n    'tau': 964,\n    'there4': 8756,\n    'theta': 952,\n    'thetasym': 977,\n    'thinsp': 8201,\n    'thorn': 254,\n    'tilde': 732,\n    'times': 215,\n    'trade': 8482,\n    'uArr': 8657,\n    'uacute': 250,\n    'uarr': 8593,\n    'ucirc': 251,\n    'ugrave': 249,\n    'uml': 168,\n    'upsih': 978,\n    'upsilon': 965,\n    'uuml': 252,\n    'weierp': 8472,\n    'xi': 958,\n    'yacute': 253,\n    'yen': 165,\n    'yuml': 255,\n    'zeta': 950,\n    'zwj': 8205,\n    'zwnj': 8204\n}\n"
  },
  {
    "path": "lib/markupsafe/_native.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    markupsafe._native\n    ~~~~~~~~~~~~~~~~~~\n\n    Native Python implementation the C module is not compiled.\n\n    :copyright: (c) 2010 by Armin Ronacher.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nfrom markupsafe import Markup\nfrom markupsafe._compat import text_type\n\n\ndef escape(s):\n    \"\"\"Convert the characters &, <, >, ' and \" in string s to HTML-safe\n    sequences.  Use this if you need to display text that might contain\n    such characters in HTML.  Marks return value as markup string.\n    \"\"\"\n    if hasattr(s, '__html__'):\n        return s.__html__()\n    return Markup(text_type(s)\n        .replace('&', '&amp;')\n        .replace('>', '&gt;')\n        .replace('<', '&lt;')\n        .replace(\"'\", '&#39;')\n        .replace('\"', '&#34;')\n    )\n\n\ndef escape_silent(s):\n    \"\"\"Like :func:`escape` but converts `None` into an empty\n    markup string.\n    \"\"\"\n    if s is None:\n        return Markup()\n    return escape(s)\n\n\ndef soft_unicode(s):\n    \"\"\"Make a string unicode if it isn't already.  That way a markup\n    string is not converted back to unicode.\n    \"\"\"\n    if not isinstance(s, text_type):\n        s = text_type(s)\n    return s\n"
  },
  {
    "path": "lib/markupsafe/_speedups.c",
    "content": "/**\n * markupsafe._speedups\n * ~~~~~~~~~~~~~~~~~~~~\n *\n * This module implements functions for automatic escaping in C for better\n * performance.\n *\n * :copyright: (c) 2010 by Armin Ronacher.\n * :license: BSD.\n */\n\n#include <Python.h>\n\n#define ESCAPED_CHARS_TABLE_SIZE 63\n#define UNICHR(x) (PyUnicode_AS_UNICODE((PyUnicodeObject*)PyUnicode_DecodeASCII(x, strlen(x), NULL)));\n\n#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN)\ntypedef int Py_ssize_t;\n#define PY_SSIZE_T_MAX INT_MAX\n#define PY_SSIZE_T_MIN INT_MIN\n#endif\n\n\nstatic PyObject* markup;\nstatic Py_ssize_t escaped_chars_delta_len[ESCAPED_CHARS_TABLE_SIZE];\nstatic Py_UNICODE *escaped_chars_repl[ESCAPED_CHARS_TABLE_SIZE];\n\nstatic int\ninit_constants(void)\n{\n\tPyObject *module;\n\t/* happing of characters to replace */\n\tescaped_chars_repl['\"'] = UNICHR(\"&#34;\");\n\tescaped_chars_repl['\\''] = UNICHR(\"&#39;\");\n\tescaped_chars_repl['&'] = UNICHR(\"&amp;\");\n\tescaped_chars_repl['<'] = UNICHR(\"&lt;\");\n\tescaped_chars_repl['>'] = UNICHR(\"&gt;\");\n\n\t/* lengths of those characters when replaced - 1 */\n\tmemset(escaped_chars_delta_len, 0, sizeof (escaped_chars_delta_len));\n\tescaped_chars_delta_len['\"'] = escaped_chars_delta_len['\\''] = \\\n\t\tescaped_chars_delta_len['&'] = 4;\n\tescaped_chars_delta_len['<'] = escaped_chars_delta_len['>'] = 3;\n\t\n\t/* import markup type so that we can mark the return value */\n\tmodule = PyImport_ImportModule(\"markupsafe\");\n\tif (!module)\n\t\treturn 0;\n\tmarkup = PyObject_GetAttrString(module, \"Markup\");\n\tPy_DECREF(module);\n\n\treturn 1;\n}\n\nstatic PyObject*\nescape_unicode(PyUnicodeObject *in)\n{\n\tPyUnicodeObject *out;\n\tPy_UNICODE *inp = PyUnicode_AS_UNICODE(in);\n\tconst Py_UNICODE *inp_end = PyUnicode_AS_UNICODE(in) + PyUnicode_GET_SIZE(in);\n\tPy_UNICODE *next_escp;\n\tPy_UNICODE *outp;\n\tPy_ssize_t delta=0, erepl=0, delta_len=0;\n\n\t/* First we need to figure out how long the escaped string will be */\n\twhile (*(inp) || inp < inp_end) {\n\t\tif (*inp < ESCAPED_CHARS_TABLE_SIZE) {\n\t\t\tdelta += escaped_chars_delta_len[*inp];\n\t\t\terepl += !!escaped_chars_delta_len[*inp];\n\t\t}\n\t\t++inp;\n\t}\n\n\t/* Do we need to escape anything at all? */\n\tif (!erepl) {\n\t\tPy_INCREF(in);\n\t\treturn (PyObject*)in;\n\t}\n\n\tout = (PyUnicodeObject*)PyUnicode_FromUnicode(NULL, PyUnicode_GET_SIZE(in) + delta);\n\tif (!out)\n\t\treturn NULL;\n\n\toutp = PyUnicode_AS_UNICODE(out);\n\tinp = PyUnicode_AS_UNICODE(in);\n\twhile (erepl-- > 0) {\n\t\t/* look for the next substitution */\n\t\tnext_escp = inp;\n\t\twhile (next_escp < inp_end) {\n\t\t\tif (*next_escp < ESCAPED_CHARS_TABLE_SIZE &&\n\t\t\t    (delta_len = escaped_chars_delta_len[*next_escp])) {\n\t\t\t\t++delta_len;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t++next_escp;\n\t\t}\n\t\t\n\t\tif (next_escp > inp) {\n\t\t\t/* copy unescaped chars between inp and next_escp */\n\t\t\tPy_UNICODE_COPY(outp, inp, next_escp-inp);\n\t\t\toutp += next_escp - inp;\n\t\t}\n\n\t\t/* escape 'next_escp' */\n\t\tPy_UNICODE_COPY(outp, escaped_chars_repl[*next_escp], delta_len);\n\t\toutp += delta_len;\n\n\t\tinp = next_escp + 1;\n\t}\n\tif (inp < inp_end)\n\t\tPy_UNICODE_COPY(outp, inp, PyUnicode_GET_SIZE(in) - (inp - PyUnicode_AS_UNICODE(in)));\n\n\treturn (PyObject*)out;\n}\n\n\nstatic PyObject*\nescape(PyObject *self, PyObject *text)\n{\n\tPyObject *s = NULL, *rv = NULL, *html;\n\n\t/* we don't have to escape integers, bools or floats */\n\tif (PyLong_CheckExact(text) ||\n#if PY_MAJOR_VERSION < 3\n\t    PyInt_CheckExact(text) ||\n#endif\n\t    PyFloat_CheckExact(text) || PyBool_Check(text) ||\n\t    text == Py_None)\n\t\treturn PyObject_CallFunctionObjArgs(markup, text, NULL);\n\n\t/* if the object has an __html__ method that performs the escaping */\n\thtml = PyObject_GetAttrString(text, \"__html__\");\n\tif (html) {\n\t\trv = PyObject_CallObject(html, NULL);\n\t\tPy_DECREF(html);\n\t\treturn rv;\n\t}\n\n\t/* otherwise make the object unicode if it isn't, then escape */\n\tPyErr_Clear();\n\tif (!PyUnicode_Check(text)) {\n#if PY_MAJOR_VERSION < 3\n\t\tPyObject *unicode = PyObject_Unicode(text);\n#else\n\t\tPyObject *unicode = PyObject_Str(text);\n#endif\n\t\tif (!unicode)\n\t\t\treturn NULL;\n\t\ts = escape_unicode((PyUnicodeObject*)unicode);\n\t\tPy_DECREF(unicode);\n\t}\n\telse\n\t\ts = escape_unicode((PyUnicodeObject*)text);\n\n\t/* convert the unicode string into a markup object. */\n\trv = PyObject_CallFunctionObjArgs(markup, (PyObject*)s, NULL);\n\tPy_DECREF(s);\n\treturn rv;\n}\n\n\nstatic PyObject*\nescape_silent(PyObject *self, PyObject *text)\n{\n\tif (text != Py_None)\n\t\treturn escape(self, text);\n\treturn PyObject_CallFunctionObjArgs(markup, NULL);\n}\n\n\nstatic PyObject*\nsoft_unicode(PyObject *self, PyObject *s)\n{\n\tif (!PyUnicode_Check(s))\n#if PY_MAJOR_VERSION < 3\n\t\treturn PyObject_Unicode(s);\n#else\n\t\treturn PyObject_Str(s);\n#endif\n\tPy_INCREF(s);\n\treturn s;\n}\n\n\nstatic PyMethodDef module_methods[] = {\n\t{\"escape\", (PyCFunction)escape, METH_O,\n\t \"escape(s) -> markup\\n\\n\"\n\t \"Convert the characters &, <, >, ', and \\\" in string s to HTML-safe\\n\"\n\t \"sequences.  Use this if you need to display text that might contain\\n\"\n\t \"such characters in HTML.  Marks return value as markup string.\"},\n\t{\"escape_silent\", (PyCFunction)escape_silent, METH_O,\n\t \"escape_silent(s) -> markup\\n\\n\"\n\t \"Like escape but converts None to an empty string.\"},\n\t{\"soft_unicode\", (PyCFunction)soft_unicode, METH_O,\n\t \"soft_unicode(object) -> string\\n\\n\"\n         \"Make a string unicode if it isn't already.  That way a markup\\n\"\n         \"string is not converted back to unicode.\"},\n\t{NULL, NULL, 0, NULL}\t\t/* Sentinel */\n};\n\n\n#if PY_MAJOR_VERSION < 3\n\n#ifndef PyMODINIT_FUNC\t/* declarations for DLL import/export */\n#define PyMODINIT_FUNC void\n#endif\nPyMODINIT_FUNC\ninit_speedups(void)\n{\n\tif (!init_constants())\n\t\treturn;\n\n\tPy_InitModule3(\"markupsafe._speedups\", module_methods, \"\");\n}\n\n#else /* Python 3.x module initialization */\n\nstatic struct PyModuleDef module_definition = {\n        PyModuleDef_HEAD_INIT,\n\t\"markupsafe._speedups\",\n\tNULL,\n\t-1,\n\tmodule_methods,\n\tNULL,\n\tNULL,\n\tNULL,\n\tNULL\n};\n\nPyMODINIT_FUNC\nPyInit__speedups(void)\n{\n\tif (!init_constants())\n\t\treturn NULL;\n\n\treturn PyModule_Create(&module_definition);\n}\n\n#endif\n"
  },
  {
    "path": "lib/markupsafe/tests.py",
    "content": "# -*- coding: utf-8 -*-\nimport gc\nimport sys\nimport unittest\nfrom markupsafe import Markup, escape, escape_silent\nfrom markupsafe._compat import text_type\n\n\nclass MarkupTestCase(unittest.TestCase):\n\n    def test_adding(self):\n        # adding two strings should escape the unsafe one\n        unsafe = '<script type=\"application/x-some-script\">alert(\"foo\");</script>'\n        safe = Markup('<em>username</em>')\n        assert unsafe + safe == text_type(escape(unsafe)) + text_type(safe)\n\n    def test_string_interpolation(self):\n        # string interpolations are safe to use too\n        assert Markup('<em>%s</em>') % '<bad user>' == \\\n               '<em>&lt;bad user&gt;</em>'\n        assert Markup('<em>%(username)s</em>') % {\n            'username': '<bad user>'\n        } == '<em>&lt;bad user&gt;</em>'\n\n        assert Markup('%i') % 3.14 == '3'\n        assert Markup('%.2f') % 3.14 == '3.14'\n\n    def test_type_behavior(self):\n        # an escaped object is markup too\n        assert type(Markup('foo') + 'bar') is Markup\n\n        # and it implements __html__ by returning itself\n        x = Markup(\"foo\")\n        assert x.__html__() is x\n\n    def test_html_interop(self):\n        # it also knows how to treat __html__ objects\n        class Foo(object):\n            def __html__(self):\n                return '<em>awesome</em>'\n            def __unicode__(self):\n                return 'awesome'\n            __str__ = __unicode__\n        assert Markup(Foo()) == '<em>awesome</em>'\n        assert Markup('<strong>%s</strong>') % Foo() == \\\n            '<strong><em>awesome</em></strong>'\n\n    def test_tuple_interpol(self):\n        self.assertEqual(Markup('<em>%s:%s</em>') % (\n            '<foo>',\n            '<bar>',\n        ), Markup(u'<em>&lt;foo&gt;:&lt;bar&gt;</em>'))\n\n    def test_dict_interpol(self):\n        self.assertEqual(Markup('<em>%(foo)s</em>') % {\n            'foo': '<foo>',\n        }, Markup(u'<em>&lt;foo&gt;</em>'))\n        self.assertEqual(Markup('<em>%(foo)s:%(bar)s</em>') % {\n            'foo': '<foo>',\n            'bar': '<bar>',\n        }, Markup(u'<em>&lt;foo&gt;:&lt;bar&gt;</em>'))\n\n    def test_escaping(self):\n        # escaping and unescaping\n        assert escape('\"<>&\\'') == '&#34;&lt;&gt;&amp;&#39;'\n        assert Markup(\"<em>Foo &amp; Bar</em>\").striptags() == \"Foo & Bar\"\n        assert Markup(\"&lt;test&gt;\").unescape() == \"<test>\"\n\n    def test_formatting(self):\n        for actual, expected in (\n            (Markup('%i') % 3.14, '3'),\n            (Markup('%.2f') % 3.14159, '3.14'),\n            (Markup('%s %s %s') % ('<', 123, '>'), '&lt; 123 &gt;'),\n            (Markup('<em>{awesome}</em>').format(awesome='<awesome>'),\n             '<em>&lt;awesome&gt;</em>'),\n            (Markup('{0[1][bar]}').format([0, {'bar': '<bar/>'}]),\n             '&lt;bar/&gt;'),\n            (Markup('{0[1][bar]}').format([0, {'bar': Markup('<bar/>')}]),\n             '<bar/>')):\n            assert actual == expected, \"%r should be %r!\" % (actual, expected)\n\n    # This is new in 2.7\n    if sys.version_info >= (2, 7):\n        def test_formatting_empty(self):\n            formatted = Markup('{}').format(0)\n            assert formatted == Markup('0')\n\n    def test_custom_formatting(self):\n        class HasHTMLOnly(object):\n            def __html__(self):\n                return Markup('<foo>')\n\n        class HasHTMLAndFormat(object):\n            def __html__(self):\n                return Markup('<foo>')\n            def __html_format__(self, spec):\n                return Markup('<FORMAT>')\n\n        assert Markup('{0}').format(HasHTMLOnly()) == Markup('<foo>')\n        assert Markup('{0}').format(HasHTMLAndFormat()) == Markup('<FORMAT>')\n\n    def test_complex_custom_formatting(self):\n        class User(object):\n            def __init__(self, id, username):\n                self.id = id\n                self.username = username\n            def __html_format__(self, format_spec):\n                if format_spec == 'link':\n                    return Markup('<a href=\"/user/{0}\">{1}</a>').format(\n                        self.id,\n                        self.__html__(),\n                    )\n                elif format_spec:\n                    raise ValueError('Invalid format spec')\n                return self.__html__()\n            def __html__(self):\n                return Markup('<span class=user>{0}</span>').format(self.username)\n\n        user = User(1, 'foo')\n        assert Markup('<p>User: {0:link}').format(user) == \\\n            Markup('<p>User: <a href=\"/user/1\"><span class=user>foo</span></a>')\n\n    def test_all_set(self):\n        import markupsafe as markup\n        for item in markup.__all__:\n            getattr(markup, item)\n\n    def test_escape_silent(self):\n        assert escape_silent(None) == Markup()\n        assert escape(None) == Markup(None)\n        assert escape_silent('<foo>') == Markup(u'&lt;foo&gt;')\n\n    def test_splitting(self):\n        self.assertEqual(Markup('a b').split(), [\n            Markup('a'),\n            Markup('b')\n        ])\n        self.assertEqual(Markup('a b').rsplit(), [\n            Markup('a'),\n            Markup('b')\n        ])\n        self.assertEqual(Markup('a\\nb').splitlines(), [\n            Markup('a'),\n            Markup('b')\n        ])\n\n    def test_mul(self):\n        self.assertEqual(Markup('a') * 3, Markup('aaa'))\n\n\nclass MarkupLeakTestCase(unittest.TestCase):\n\n    def test_markup_leaks(self):\n        counts = set()\n        for count in range(20):\n            for item in range(1000):\n                escape(\"foo\")\n                escape(\"<foo>\")\n                escape(u\"foo\")\n                escape(u\"<foo>\")\n            counts.add(len(gc.get_objects()))\n        assert len(counts) == 1, 'ouch, c extension seems to leak objects'\n\n\ndef suite():\n    suite = unittest.TestSuite()\n    suite.addTest(unittest.makeSuite(MarkupTestCase))\n\n    # this test only tests the c extension\n    if not hasattr(escape, 'func_code'):\n        suite.addTest(unittest.makeSuite(MarkupLeakTestCase))\n\n    return suite\n\n\nif __name__ == '__main__':\n    unittest.main(defaultTest='suite')\n\n# vim:sts=4:sw=4:et:\n"
  },
  {
    "path": "lib/werkzeug/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    werkzeug\n    ~~~~~~~~\n\n    Werkzeug is the Swiss Army knife of Python web development.\n\n    It provides useful classes and functions for any WSGI application to make\n    the life of a python web developer much easier.  All of the provided\n    classes are independent from each other so you can mix it with any other\n    library.\n\n\n    :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nfrom types import ModuleType\nimport sys\n\nfrom werkzeug._compat import iteritems\n\n# the version.  Usually set automatically by a script.\n__version__ = '0.11'\n\n\n# This import magic raises concerns quite often which is why the implementation\n# and motivation is explained here in detail now.\n#\n# The majority of the functions and classes provided by Werkzeug work on the\n# HTTP and WSGI layer.  There is no useful grouping for those which is why\n# they are all importable from \"werkzeug\" instead of the modules where they are\n# implemented.  The downside of that is, that now everything would be loaded at\n# once, even if unused.\n#\n# The implementation of a lazy-loading module in this file replaces the\n# werkzeug package when imported from within.  Attribute access to the werkzeug\n# module will then lazily import from the modules that implement the objects.\n\n\n# import mapping to objects in other modules\nall_by_module = {\n    'werkzeug.debug': ['DebuggedApplication'],\n    'werkzeug.local': ['Local', 'LocalManager', 'LocalProxy', 'LocalStack',\n                       'release_local'],\n    'werkzeug.serving': ['run_simple'],\n    'werkzeug.test': ['Client', 'EnvironBuilder', 'create_environ',\n                      'run_wsgi_app'],\n    'werkzeug.testapp': ['test_app'],\n    'werkzeug.exceptions': ['abort', 'Aborter'],\n    'werkzeug.urls': ['url_decode', 'url_encode', 'url_quote',\n                      'url_quote_plus', 'url_unquote', 'url_unquote_plus',\n                      'url_fix', 'Href', 'iri_to_uri', 'uri_to_iri'],\n    'werkzeug.formparser': ['parse_form_data'],\n    'werkzeug.utils': ['escape', 'environ_property', 'append_slash_redirect',\n                       'redirect', 'cached_property', 'import_string',\n                       'dump_cookie', 'parse_cookie', 'unescape',\n                       'format_string', 'find_modules', 'header_property',\n                       'html', 'xhtml', 'HTMLBuilder', 'validate_arguments',\n                       'ArgumentValidationError', 'bind_arguments',\n                       'secure_filename'],\n    'werkzeug.wsgi': ['get_current_url', 'get_host', 'pop_path_info',\n                      'peek_path_info', 'SharedDataMiddleware',\n                      'DispatcherMiddleware', 'ClosingIterator', 'FileWrapper',\n                      'make_line_iter', 'LimitedStream', 'responder',\n                      'wrap_file', 'extract_path_info'],\n    'werkzeug.datastructures': ['MultiDict', 'CombinedMultiDict', 'Headers',\n                                'EnvironHeaders', 'ImmutableList',\n                                'ImmutableDict', 'ImmutableMultiDict',\n                                'TypeConversionDict',\n                                'ImmutableTypeConversionDict', 'Accept',\n                                'MIMEAccept', 'CharsetAccept',\n                                'LanguageAccept', 'RequestCacheControl',\n                                'ResponseCacheControl', 'ETags', 'HeaderSet',\n                                'WWWAuthenticate', 'Authorization',\n                                'FileMultiDict', 'CallbackDict', 'FileStorage',\n                                'OrderedMultiDict', 'ImmutableOrderedMultiDict'\n                                ],\n    'werkzeug.useragents':  ['UserAgent'],\n    'werkzeug.http': ['parse_etags', 'parse_date', 'http_date', 'cookie_date',\n                      'parse_cache_control_header', 'is_resource_modified',\n                      'parse_accept_header', 'parse_set_header', 'quote_etag',\n                      'unquote_etag', 'generate_etag', 'dump_header',\n                      'parse_list_header', 'parse_dict_header',\n                      'parse_authorization_header',\n                      'parse_www_authenticate_header', 'remove_entity_headers',\n                      'is_entity_header', 'remove_hop_by_hop_headers',\n                      'parse_options_header', 'dump_options_header',\n                      'is_hop_by_hop_header', 'unquote_header_value',\n                      'quote_header_value', 'HTTP_STATUS_CODES'],\n    'werkzeug.wrappers': ['BaseResponse', 'BaseRequest', 'Request', 'Response',\n                          'AcceptMixin', 'ETagRequestMixin',\n                          'ETagResponseMixin', 'ResponseStreamMixin',\n                          'CommonResponseDescriptorsMixin', 'UserAgentMixin',\n                          'AuthorizationMixin', 'WWWAuthenticateMixin',\n                          'CommonRequestDescriptorsMixin'],\n    'werkzeug.security': ['generate_password_hash', 'check_password_hash'],\n    # the undocumented easteregg ;-)\n    'werkzeug._internal': ['_easteregg']\n}\n\n# modules that should be imported when accessed as attributes of werkzeug\nattribute_modules = frozenset(['exceptions', 'routing', 'script'])\n\n\nobject_origins = {}\nfor module, items in iteritems(all_by_module):\n    for item in items:\n        object_origins[item] = module\n\n\nclass module(ModuleType):\n\n    \"\"\"Automatically import objects from the modules.\"\"\"\n\n    def __getattr__(self, name):\n        if name in object_origins:\n            module = __import__(object_origins[name], None, None, [name])\n            for extra_name in all_by_module[module.__name__]:\n                setattr(self, extra_name, getattr(module, extra_name))\n            return getattr(module, name)\n        elif name in attribute_modules:\n            __import__('werkzeug.' + name)\n        return ModuleType.__getattribute__(self, name)\n\n    def __dir__(self):\n        \"\"\"Just show what we want to show.\"\"\"\n        result = list(new_module.__all__)\n        result.extend(('__file__', '__path__', '__doc__', '__all__',\n                       '__docformat__', '__name__', '__path__',\n                       '__package__', '__version__'))\n        return result\n\n# keep a reference to this module so that it's not garbage collected\nold_module = sys.modules['werkzeug']\n\n\n# setup the new module and patch it into the dict of loaded modules\nnew_module = sys.modules['werkzeug'] = module('werkzeug')\nnew_module.__dict__.update({\n    '__file__':         __file__,\n    '__package__':      'werkzeug',\n    '__path__':         __path__,\n    '__doc__':          __doc__,\n    '__version__':      __version__,\n    '__all__':          tuple(object_origins) + tuple(attribute_modules),\n    '__docformat__':    'restructuredtext en'\n})\n\n\n# Due to bootstrapping issues we need to import exceptions here.\n# Don't ask :-(\n__import__('werkzeug.exceptions')\n"
  },
  {
    "path": "lib/werkzeug/_compat.py",
    "content": "# flake8: noqa\n# This whole file is full of lint errors\nimport codecs\nimport sys\nimport operator\nimport functools\nimport warnings\n\ntry:\n    import builtins\nexcept ImportError:\n    import __builtin__ as builtins\n\n\nPY2 = sys.version_info[0] == 2\nWIN = sys.platform.startswith('win')\n\n_identity = lambda x: x\n\nif PY2:\n    unichr = unichr\n    text_type = unicode\n    string_types = (str, unicode)\n    integer_types = (int, long)\n\n    iterkeys = lambda d, *args, **kwargs: d.iterkeys(*args, **kwargs)\n    itervalues = lambda d, *args, **kwargs: d.itervalues(*args, **kwargs)\n    iteritems = lambda d, *args, **kwargs: d.iteritems(*args, **kwargs)\n\n    iterlists = lambda d, *args, **kwargs: d.iterlists(*args, **kwargs)\n    iterlistvalues = lambda d, *args, **kwargs: d.iterlistvalues(*args, **kwargs)\n\n    int_to_byte = chr\n    iter_bytes = iter\n\n    exec('def reraise(tp, value, tb=None):\\n raise tp, value, tb')\n\n    def fix_tuple_repr(obj):\n        def __repr__(self):\n            cls = self.__class__\n            return '%s(%s)' % (cls.__name__, ', '.join(\n                '%s=%r' % (field, self[index])\n                for index, field in enumerate(cls._fields)\n            ))\n        obj.__repr__ = __repr__\n        return obj\n\n    def implements_iterator(cls):\n        cls.next = cls.__next__\n        del cls.__next__\n        return cls\n\n    def implements_to_string(cls):\n        cls.__unicode__ = cls.__str__\n        cls.__str__ = lambda x: x.__unicode__().encode('utf-8')\n        return cls\n\n    def native_string_result(func):\n        def wrapper(*args, **kwargs):\n            return func(*args, **kwargs).encode('utf-8')\n        return functools.update_wrapper(wrapper, func)\n\n    def implements_bool(cls):\n        cls.__nonzero__ = cls.__bool__\n        del cls.__bool__\n        return cls\n\n    from itertools import imap, izip, ifilter\n    range_type = xrange\n\n    from StringIO import StringIO\n    from cStringIO import StringIO as BytesIO\n    NativeStringIO = BytesIO\n\n    def make_literal_wrapper(reference):\n        return _identity\n\n    def normalize_string_tuple(tup):\n        \"\"\"Normalizes a string tuple to a common type. Following Python 2\n        rules, upgrades to unicode are implicit.\n        \"\"\"\n        if any(isinstance(x, text_type) for x in tup):\n            return tuple(to_unicode(x) for x in tup)\n        return tup\n\n    def try_coerce_native(s):\n        \"\"\"Try to coerce a unicode string to native if possible. Otherwise,\n        leave it as unicode.\n        \"\"\"\n        try:\n            return to_native(s)\n        except UnicodeError:\n            return s\n\n    wsgi_get_bytes = _identity\n\n    def wsgi_decoding_dance(s, charset='utf-8', errors='replace'):\n        return s.decode(charset, errors)\n\n    def wsgi_encoding_dance(s, charset='utf-8', errors='replace'):\n        if isinstance(s, bytes):\n            return s\n        return s.encode(charset, errors)\n\n    def to_bytes(x, charset=sys.getdefaultencoding(), errors='strict'):\n        if x is None:\n            return None\n        if isinstance(x, (bytes, bytearray, buffer)):\n            return bytes(x)\n        if isinstance(x, unicode):\n            return x.encode(charset, errors)\n        raise TypeError('Expected bytes')\n\n    def to_native(x, charset=sys.getdefaultencoding(), errors='strict'):\n        if x is None or isinstance(x, str):\n            return x\n        return x.encode(charset, errors)\n\nelse:\n    unichr = chr\n    text_type = str\n    string_types = (str, )\n    integer_types = (int, )\n\n    iterkeys = lambda d, *args, **kwargs: iter(d.keys(*args, **kwargs))\n    itervalues = lambda d, *args, **kwargs: iter(d.values(*args, **kwargs))\n    iteritems = lambda d, *args, **kwargs: iter(d.items(*args, **kwargs))\n\n    iterlists = lambda d, *args, **kwargs: iter(d.lists(*args, **kwargs))\n    iterlistvalues = lambda d, *args, **kwargs: iter(d.listvalues(*args, **kwargs))\n\n    int_to_byte = operator.methodcaller('to_bytes', 1, 'big')\n    iter_bytes = functools.partial(map, int_to_byte)\n\n    def reraise(tp, value, tb=None):\n        if value.__traceback__ is not tb:\n            raise value.with_traceback(tb)\n        raise value\n\n    fix_tuple_repr = _identity\n    implements_iterator = _identity\n    implements_to_string = _identity\n    implements_bool = _identity\n    native_string_result = _identity\n    imap = map\n    izip = zip\n    ifilter = filter\n    range_type = range\n\n    from io import StringIO, BytesIO\n    NativeStringIO = StringIO\n\n    _latin1_encode = operator.methodcaller('encode', 'latin1')\n\n    def make_literal_wrapper(reference):\n        if isinstance(reference, text_type):\n            return _identity\n        return _latin1_encode\n\n    def normalize_string_tuple(tup):\n        \"\"\"Ensures that all types in the tuple are either strings\n        or bytes.\n        \"\"\"\n        tupiter = iter(tup)\n        is_text = isinstance(next(tupiter, None), text_type)\n        for arg in tupiter:\n            if isinstance(arg, text_type) != is_text:\n                raise TypeError('Cannot mix str and bytes arguments (got %s)'\n                                % repr(tup))\n        return tup\n\n    try_coerce_native = _identity\n    wsgi_get_bytes = _latin1_encode\n\n    def wsgi_decoding_dance(s, charset='utf-8', errors='replace'):\n        return s.encode('latin1').decode(charset, errors)\n\n    def wsgi_encoding_dance(s, charset='utf-8', errors='replace'):\n        if isinstance(s, text_type):\n            s = s.encode(charset)\n        return s.decode('latin1', errors)\n\n    def to_bytes(x, charset=sys.getdefaultencoding(), errors='strict'):\n        if x is None:\n            return None\n        if isinstance(x, (bytes, bytearray, memoryview)):  # noqa\n            return bytes(x)\n        if isinstance(x, str):\n            return x.encode(charset, errors)\n        raise TypeError('Expected bytes')\n\n    def to_native(x, charset=sys.getdefaultencoding(), errors='strict'):\n        if x is None or isinstance(x, str):\n            return x\n        return x.decode(charset, errors)\n\n\ndef to_unicode(x, charset=sys.getdefaultencoding(), errors='strict',\n               allow_none_charset=False):\n    if x is None:\n        return None\n    if not isinstance(x, bytes):\n        return text_type(x)\n    if charset is None and allow_none_charset:\n        return x\n    return x.decode(charset, errors)\n"
  },
  {
    "path": "lib/werkzeug/_internal.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    werkzeug._internal\n    ~~~~~~~~~~~~~~~~~~\n\n    This module provides internally used helpers and constants.\n\n    :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nimport re\nimport string\nimport inspect\nfrom weakref import WeakKeyDictionary\nfrom datetime import datetime, date\nfrom itertools import chain\n\nfrom werkzeug._compat import iter_bytes, text_type, BytesIO, int_to_byte, \\\n    range_type, integer_types\n\n\n_logger = None\n_empty_stream = BytesIO()\n_signature_cache = WeakKeyDictionary()\n_epoch_ord = date(1970, 1, 1).toordinal()\n_cookie_params = set((b'expires', b'path', b'comment',\n                      b'max-age', b'secure', b'httponly',\n                      b'version'))\n_legal_cookie_chars = (string.ascii_letters +\n                       string.digits +\n                       u\"!#$%&'*+-.^_`|~:\").encode('ascii')\n\n_cookie_quoting_map = {\n    b',': b'\\\\054',\n    b';': b'\\\\073',\n    b'\"': b'\\\\\"',\n    b'\\\\': b'\\\\\\\\',\n}\nfor _i in chain(range_type(32), range_type(127, 256)):\n    _cookie_quoting_map[int_to_byte(_i)] = ('\\\\%03o' % _i).encode('latin1')\n\n\n_octal_re = re.compile(b'\\\\\\\\[0-3][0-7][0-7]')\n_quote_re = re.compile(b'[\\\\\\\\].')\n_legal_cookie_chars_re = b'[\\w\\d!#%&\\'~_`><@,:/\\$\\*\\+\\-\\.\\^\\|\\)\\(\\?\\}\\{\\=]'\n_cookie_re = re.compile(b\"\"\"(?x)\n    (?P<key>[^=]+)\n    \\s*=\\s*\n    (?P<val>\n        \"(?:[^\\\\\\\\\"]|\\\\\\\\.)*\" |\n         (?:.*?)\n    )\n    \\s*;\n\"\"\")\n\n\nclass _Missing(object):\n\n    def __repr__(self):\n        return 'no value'\n\n    def __reduce__(self):\n        return '_missing'\n\n_missing = _Missing()\n\n\ndef _get_environ(obj):\n    env = getattr(obj, 'environ', obj)\n    assert isinstance(env, dict), \\\n        '%r is not a WSGI environment (has to be a dict)' % type(obj).__name__\n    return env\n\n\ndef _log(type, message, *args, **kwargs):\n    \"\"\"Log into the internal werkzeug logger.\"\"\"\n    global _logger\n    if _logger is None:\n        import logging\n        _logger = logging.getLogger('werkzeug')\n        # Only set up a default log handler if the\n        # end-user application didn't set anything up.\n        if not logging.root.handlers and _logger.level == logging.NOTSET:\n            _logger.setLevel(logging.INFO)\n            handler = logging.StreamHandler()\n            _logger.addHandler(handler)\n    getattr(_logger, type)(message.rstrip(), *args, **kwargs)\n\n\ndef _parse_signature(func):\n    \"\"\"Return a signature object for the function.\"\"\"\n    if hasattr(func, 'im_func'):\n        func = func.im_func\n\n    # if we have a cached validator for this function, return it\n    parse = _signature_cache.get(func)\n    if parse is not None:\n        return parse\n\n    # inspect the function signature and collect all the information\n    positional, vararg_var, kwarg_var, defaults = inspect.getargspec(func)\n    defaults = defaults or ()\n    arg_count = len(positional)\n    arguments = []\n    for idx, name in enumerate(positional):\n        if isinstance(name, list):\n            raise TypeError('cannot parse functions that unpack tuples '\n                            'in the function signature')\n        try:\n            default = defaults[idx - arg_count]\n        except IndexError:\n            param = (name, False, None)\n        else:\n            param = (name, True, default)\n        arguments.append(param)\n    arguments = tuple(arguments)\n\n    def parse(args, kwargs):\n        new_args = []\n        missing = []\n        extra = {}\n\n        # consume as many arguments as positional as possible\n        for idx, (name, has_default, default) in enumerate(arguments):\n            try:\n                new_args.append(args[idx])\n            except IndexError:\n                try:\n                    new_args.append(kwargs.pop(name))\n                except KeyError:\n                    if has_default:\n                        new_args.append(default)\n                    else:\n                        missing.append(name)\n            else:\n                if name in kwargs:\n                    extra[name] = kwargs.pop(name)\n\n        # handle extra arguments\n        extra_positional = args[arg_count:]\n        if vararg_var is not None:\n            new_args.extend(extra_positional)\n            extra_positional = ()\n        if kwargs and kwarg_var is None:\n            extra.update(kwargs)\n            kwargs = {}\n\n        return new_args, kwargs, missing, extra, extra_positional, \\\n            arguments, vararg_var, kwarg_var\n    _signature_cache[func] = parse\n    return parse\n\n\ndef _date_to_unix(arg):\n    \"\"\"Converts a timetuple, integer or datetime object into the seconds from\n    epoch in utc.\n    \"\"\"\n    if isinstance(arg, datetime):\n        arg = arg.utctimetuple()\n    elif isinstance(arg, integer_types + (float,)):\n        return int(arg)\n    year, month, day, hour, minute, second = arg[:6]\n    days = date(year, month, 1).toordinal() - _epoch_ord + day - 1\n    hours = days * 24 + hour\n    minutes = hours * 60 + minute\n    seconds = minutes * 60 + second\n    return seconds\n\n\nclass _DictAccessorProperty(object):\n\n    \"\"\"Baseclass for `environ_property` and `header_property`.\"\"\"\n    read_only = False\n\n    def __init__(self, name, default=None, load_func=None, dump_func=None,\n                 read_only=None, doc=None):\n        self.name = name\n        self.default = default\n        self.load_func = load_func\n        self.dump_func = dump_func\n        if read_only is not None:\n            self.read_only = read_only\n        self.__doc__ = doc\n\n    def __get__(self, obj, type=None):\n        if obj is None:\n            return self\n        storage = self.lookup(obj)\n        if self.name not in storage:\n            return self.default\n        rv = storage[self.name]\n        if self.load_func is not None:\n            try:\n                rv = self.load_func(rv)\n            except (ValueError, TypeError):\n                rv = self.default\n        return rv\n\n    def __set__(self, obj, value):\n        if self.read_only:\n            raise AttributeError('read only property')\n        if self.dump_func is not None:\n            value = self.dump_func(value)\n        self.lookup(obj)[self.name] = value\n\n    def __delete__(self, obj):\n        if self.read_only:\n            raise AttributeError('read only property')\n        self.lookup(obj).pop(self.name, None)\n\n    def __repr__(self):\n        return '<%s %s>' % (\n            self.__class__.__name__,\n            self.name\n        )\n\n\ndef _cookie_quote(b):\n    buf = bytearray()\n    all_legal = True\n    _lookup = _cookie_quoting_map.get\n    _push = buf.extend\n\n    for char in iter_bytes(b):\n        if char not in _legal_cookie_chars:\n            all_legal = False\n            char = _lookup(char, char)\n        _push(char)\n\n    if all_legal:\n        return bytes(buf)\n    return bytes(b'\"' + buf + b'\"')\n\n\ndef _cookie_unquote(b):\n    if len(b) < 2:\n        return b\n    if b[:1] != b'\"' or b[-1:] != b'\"':\n        return b\n\n    b = b[1:-1]\n\n    i = 0\n    n = len(b)\n    rv = bytearray()\n    _push = rv.extend\n\n    while 0 <= i < n:\n        o_match = _octal_re.search(b, i)\n        q_match = _quote_re.search(b, i)\n        if not o_match and not q_match:\n            rv.extend(b[i:])\n            break\n        j = k = -1\n        if o_match:\n            j = o_match.start(0)\n        if q_match:\n            k = q_match.start(0)\n        if q_match and (not o_match or k < j):\n            _push(b[i:k])\n            _push(b[k + 1:k + 2])\n            i = k + 2\n        else:\n            _push(b[i:j])\n            rv.append(int(b[j + 1:j + 4], 8))\n            i = j + 4\n\n    return bytes(rv)\n\n\ndef _cookie_parse_impl(b):\n    \"\"\"Lowlevel cookie parsing facility that operates on bytes.\"\"\"\n    i = 0\n    n = len(b)\n\n    while i < n:\n        match = _cookie_re.search(b + b';', i)\n        if not match:\n            break\n\n        key = match.group('key').strip()\n        value = match.group('val')\n        i = match.end(0)\n\n        # Ignore parameters.  We have no interest in them.\n        if key.lower() not in _cookie_params:\n            yield _cookie_unquote(key), _cookie_unquote(value)\n\n\ndef _encode_idna(domain):\n    # If we're given bytes, make sure they fit into ASCII\n    if not isinstance(domain, text_type):\n        domain.decode('ascii')\n        return domain\n\n    # Otherwise check if it's already ascii, then return\n    try:\n        return domain.encode('ascii')\n    except UnicodeError:\n        pass\n\n    # Otherwise encode each part separately\n    parts = domain.split('.')\n    for idx, part in enumerate(parts):\n        parts[idx] = part.encode('idna')\n    return b'.'.join(parts)\n\n\ndef _decode_idna(domain):\n    # If the input is a string try to encode it to ascii to\n    # do the idna decoding.  if that fails because of an\n    # unicode error, then we already have a decoded idna domain\n    if isinstance(domain, text_type):\n        try:\n            domain = domain.encode('ascii')\n        except UnicodeError:\n            return domain\n\n    # Decode each part separately.  If a part fails, try to\n    # decode it with ascii and silently ignore errors.  This makes\n    # most sense because the idna codec does not have error handling\n    parts = domain.split(b'.')\n    for idx, part in enumerate(parts):\n        try:\n            parts[idx] = part.decode('idna')\n        except UnicodeError:\n            parts[idx] = part.decode('ascii', 'ignore')\n\n    return '.'.join(parts)\n\n\ndef _make_cookie_domain(domain):\n    if domain is None:\n        return None\n    domain = _encode_idna(domain)\n    if b':' in domain:\n        domain = domain.split(b':', 1)[0]\n    if b'.' in domain:\n        return domain\n    raise ValueError(\n        'Setting \\'domain\\' for a cookie on a server running locally (ex: '\n        'localhost) is not supported by complying browsers. You should '\n        'have something like: \\'127.0.0.1 localhost dev.localhost\\' on '\n        'your hosts file and then point your server to run on '\n        '\\'dev.localhost\\' and also set \\'domain\\' for \\'dev.localhost\\''\n    )\n\n\ndef _easteregg(app=None):\n    \"\"\"Like the name says.  But who knows how it works?\"\"\"\n    def bzzzzzzz(gyver):\n        import base64\n        import zlib\n        return zlib.decompress(base64.b64decode(gyver)).decode('ascii')\n    gyver = u'\\n'.join([x + (77 - len(x)) * u' ' for x in bzzzzzzz(b'''\neJyFlzuOJDkMRP06xRjymKgDJCDQStBYT8BCgK4gTwfQ2fcFs2a2FzvZk+hvlcRvRJD148efHt9m\n9Xz94dRY5hGt1nrYcXx7us9qlcP9HHNh28rz8dZj+q4rynVFFPdlY4zH873NKCexrDM6zxxRymzz\n4QIxzK4bth1PV7+uHn6WXZ5C4ka/+prFzx3zWLMHAVZb8RRUxtFXI5DTQ2n3Hi2sNI+HK43AOWSY\njmEzE4naFp58PdzhPMdslLVWHTGUVpSxImw+pS/D+JhzLfdS1j7PzUMxij+mc2U0I9zcbZ/HcZxc\nq1QjvvcThMYFnp93agEx392ZdLJWXbi/Ca4Oivl4h/Y1ErEqP+lrg7Xa4qnUKu5UE9UUA4xeqLJ5\njWlPKJvR2yhRI7xFPdzPuc6adXu6ovwXwRPXXnZHxlPtkSkqWHilsOrGrvcVWXgGP3daXomCj317\n8P2UOw/NnA0OOikZyFf3zZ76eN9QXNwYdD8f8/LdBRFg0BO3bB+Pe/+G8er8tDJv83XTkj7WeMBJ\nv/rnAfdO51d6sFglfi8U7zbnr0u9tyJHhFZNXYfH8Iafv2Oa+DT6l8u9UYlajV/hcEgk1x8E8L/r\nXJXl2SK+GJCxtnyhVKv6GFCEB1OO3f9YWAIEbwcRWv/6RPpsEzOkXURMN37J0PoCSYeBnJQd9Giu\nLxYQJNlYPSo/iTQwgaihbART7Fcyem2tTSCcwNCs85MOOpJtXhXDe0E7zgZJkcxWTar/zEjdIVCk\niXy87FW6j5aGZhttDBoAZ3vnmlkx4q4mMmCdLtnHkBXFMCReqthSGkQ+MDXLLCpXwBs0t+sIhsDI\ntjBB8MwqYQpLygZ56rRHHpw+OAVyGgaGRHWy2QfXez+ZQQTTBkmRXdV/A9LwH6XGZpEAZU8rs4pE\n1R4FQ3Uwt8RKEtRc0/CrANUoes3EzM6WYcFyskGZ6UTHJWenBDS7h163Eo2bpzqxNE9aVgEM2CqI\nGAJe9Yra4P5qKmta27VjzYdR04Vc7KHeY4vs61C0nbywFmcSXYjzBHdiEjraS7PGG2jHHTpJUMxN\nJlxr3pUuFvlBWLJGE3GcA1/1xxLcHmlO+LAXbhrXah1tD6Ze+uqFGdZa5FM+3eHcKNaEarutAQ0A\nQMAZHV+ve6LxAwWnXbbSXEG2DmCX5ijeLCKj5lhVFBrMm+ryOttCAeFpUdZyQLAQkA06RLs56rzG\n8MID55vqr/g64Qr/wqwlE0TVxgoiZhHrbY2h1iuuyUVg1nlkpDrQ7Vm1xIkI5XRKLedN9EjzVchu\njQhXcVkjVdgP2O99QShpdvXWoSwkp5uMwyjt3jiWCqWGSiaaPAzohjPanXVLbM3x0dNskJsaCEyz\nDTKIs+7WKJD4ZcJGfMhLFBf6hlbnNkLEePF8Cx2o2kwmYF4+MzAxa6i+6xIQkswOqGO+3x9NaZX8\nMrZRaFZpLeVTYI9F/djY6DDVVs340nZGmwrDqTCiiqD5luj3OzwpmQCiQhdRYowUYEA3i1WWGwL4\nGCtSoO4XbIPFeKGU13XPkDf5IdimLpAvi2kVDVQbzOOa4KAXMFlpi/hV8F6IDe0Y2reg3PuNKT3i\nRYhZqtkQZqSB2Qm0SGtjAw7RDwaM1roESC8HWiPxkoOy0lLTRFG39kvbLZbU9gFKFRvixDZBJmpi\nXyq3RE5lW00EJjaqwp/v3EByMSpVZYsEIJ4APaHmVtpGSieV5CALOtNUAzTBiw81GLgC0quyzf6c\nNlWknzJeCsJ5fup2R4d8CYGN77mu5vnO1UqbfElZ9E6cR6zbHjgsr9ly18fXjZoPeDjPuzlWbFwS\npdvPkhntFvkc13qb9094LL5NrA3NIq3r9eNnop9DizWOqCEbyRBFJTHn6Tt3CG1o8a4HevYh0XiJ\nsR0AVVHuGuMOIfbuQ/OKBkGRC6NJ4u7sbPX8bG/n5sNIOQ6/Y/BX3IwRlTSabtZpYLB85lYtkkgm\np1qXK3Du2mnr5INXmT/78KI12n11EFBkJHHp0wJyLe9MvPNUGYsf+170maayRoy2lURGHAIapSpQ\nkrEDuNoJCHNlZYhKpvw4mspVWxqo415n8cD62N9+EfHrAvqQnINStetek7RY2Urv8nxsnGaZfRr/\nnhXbJ6m/yl1LzYqscDZA9QHLNbdaSTTr+kFg3bC0iYbX/eQy0Bv3h4B50/SGYzKAXkCeOLI3bcAt\nmj2Z/FM1vQWgDynsRwNvrWnJHlespkrp8+vO1jNaibm+PhqXPPv30YwDZ6jApe3wUjFQobghvW9p\n7f2zLkGNv8b191cD/3vs9Q833z8t''').splitlines()])\n\n    def easteregged(environ, start_response):\n        def injecting_start_response(status, headers, exc_info=None):\n            headers.append(('X-Powered-By', 'Werkzeug'))\n            return start_response(status, headers, exc_info)\n        if app is not None and environ.get('QUERY_STRING') != 'macgybarchakku':\n            return app(environ, injecting_start_response)\n        injecting_start_response('200 OK', [('Content-Type', 'text/html')])\n        return [(u'''\n<!DOCTYPE html>\n<html>\n<head>\n<title>About Werkzeug</title>\n<style type=\"text/css\">\n  body { font: 15px Georgia, serif; text-align: center; }\n  a { color: #333; text-decoration: none; }\n  h1 { font-size: 30px; margin: 20px 0 10px 0; }\n  p { margin: 0 0 30px 0; }\n  pre { font: 11px 'Consolas', 'Monaco', monospace; line-height: 0.95; }\n</style>\n</head>\n<body>\n<h1><a href=\"http://werkzeug.pocoo.org/\">Werkzeug</a></h1>\n<p>the Swiss Army knife of Python web development.</p>\n<pre>%s\\n\\n\\n</pre>\n</body>\n</html>''' % gyver).encode('latin1')]\n    return easteregged\n"
  },
  {
    "path": "lib/werkzeug/_reloader.py",
    "content": "import os\nimport sys\nimport time\nimport subprocess\nimport threading\nfrom itertools import chain\n\nfrom werkzeug._internal import _log\nfrom werkzeug._compat import PY2, iteritems, text_type\n\n\ndef _iter_module_files():\n    \"\"\"This iterates over all relevant Python files.  It goes through all\n    loaded files from modules, all files in folders of already loaded modules\n    as well as all files reachable through a package.\n    \"\"\"\n    # The list call is necessary on Python 3 in case the module\n    # dictionary modifies during iteration.\n    for module in list(sys.modules.values()):\n        if module is None:\n            continue\n        filename = getattr(module, '__file__', None)\n        if filename:\n            old = None\n            while not os.path.isfile(filename):\n                old = filename\n                filename = os.path.dirname(filename)\n                if filename == old:\n                    break\n            else:\n                if filename[-4:] in ('.pyc', '.pyo'):\n                    filename = filename[:-1]\n                yield filename\n\n\ndef _find_observable_paths(extra_files=None):\n    \"\"\"Finds all paths that should be observed.\"\"\"\n    rv = set(os.path.abspath(x) for x in sys.path)\n\n    for filename in extra_files or ():\n        rv.add(os.path.dirname(os.path.abspath(filename)))\n\n    for module in list(sys.modules.values()):\n        fn = getattr(module, '__file__', None)\n        if fn is None:\n            continue\n        fn = os.path.abspath(fn)\n        rv.add(os.path.dirname(fn))\n\n    return _find_common_roots(rv)\n\n\ndef _find_common_roots(paths):\n    \"\"\"Out of some paths it finds the common roots that need monitoring.\"\"\"\n    paths = [x.split(os.path.sep) for x in paths]\n    root = {}\n    for chunks in sorted(paths, key=len, reverse=True):\n        node = root\n        for chunk in chunks:\n            node = node.setdefault(chunk, {})\n        node.clear()\n\n    rv = set()\n\n    def _walk(node, path):\n        for prefix, child in iteritems(node):\n            _walk(child, path + (prefix,))\n        if not node:\n            rv.add('/'.join(path))\n    _walk(root, ())\n    return rv\n\n\nclass ReloaderLoop(object):\n    name = None\n\n    # monkeypatched by testsuite. wrapping with `staticmethod` is required in\n    # case time.sleep has been replaced by a non-c function (e.g. by\n    # `eventlet.monkey_patch`) before we get here\n    _sleep = staticmethod(time.sleep)\n\n    def __init__(self, extra_files=None, interval=1):\n        self.extra_files = set(os.path.abspath(x)\n                               for x in extra_files or ())\n        self.interval = interval\n\n    def run(self):\n        pass\n\n    def restart_with_reloader(self):\n        \"\"\"Spawn a new Python interpreter with the same arguments as this one,\n        but running the reloader thread.\n        \"\"\"\n        while 1:\n            _log('info', ' * Restarting with %s' % self.name)\n            args = [sys.executable] + sys.argv\n            new_environ = os.environ.copy()\n            new_environ['WERKZEUG_RUN_MAIN'] = 'true'\n\n            # a weird bug on windows. sometimes unicode strings end up in the\n            # environment and subprocess.call does not like this, encode them\n            # to latin1 and continue.\n            if os.name == 'nt' and PY2:\n                for key, value in iteritems(new_environ):\n                    if isinstance(value, text_type):\n                        new_environ[key] = value.encode('iso-8859-1')\n\n            exit_code = subprocess.call(args, env=new_environ,\n                                        close_fds=False)\n            if exit_code != 3:\n                return exit_code\n\n    def trigger_reload(self, filename):\n        self.log_reload(filename)\n        sys.exit(3)\n\n    def log_reload(self, filename):\n        filename = os.path.abspath(filename)\n        _log('info', ' * Detected change in %r, reloading' % filename)\n\n\nclass StatReloaderLoop(ReloaderLoop):\n    name = 'stat'\n\n    def run(self):\n        mtimes = {}\n        while 1:\n            for filename in chain(_iter_module_files(),\n                                  self.extra_files):\n                try:\n                    mtime = os.stat(filename).st_mtime\n                except OSError:\n                    continue\n\n                old_time = mtimes.get(filename)\n                if old_time is None:\n                    mtimes[filename] = mtime\n                    continue\n                elif mtime > old_time:\n                    self.trigger_reload(filename)\n            self._sleep(self.interval)\n\n\nclass WatchdogReloaderLoop(ReloaderLoop):\n\n    def __init__(self, *args, **kwargs):\n        ReloaderLoop.__init__(self, *args, **kwargs)\n        from watchdog.observers import Observer\n        from watchdog.events import FileSystemEventHandler\n        self.observable_paths = set()\n\n        def _check_modification(filename):\n            if filename in self.extra_files:\n                self.trigger_reload(filename)\n            dirname = os.path.dirname(filename)\n            if dirname.startswith(tuple(self.observable_paths)):\n                if filename.endswith(('.pyc', '.pyo')):\n                    self.trigger_reload(filename[:-1])\n                elif filename.endswith('.py'):\n                    self.trigger_reload(filename)\n\n        class _CustomHandler(FileSystemEventHandler):\n\n            def on_created(self, event):\n                _check_modification(event.src_path)\n\n            def on_modified(self, event):\n                _check_modification(event.src_path)\n\n            def on_moved(self, event):\n                _check_modification(event.src_path)\n                _check_modification(event.dest_path)\n\n            def on_deleted(self, event):\n                _check_modification(event.src_path)\n\n        reloader_name = Observer.__name__.lower()\n        if reloader_name.endswith('observer'):\n            reloader_name = reloader_name[:-8]\n        reloader_name += ' reloader'\n\n        self.name = reloader_name\n\n        self.observer_class = Observer\n        self.event_handler = _CustomHandler()\n        self.should_reload = False\n\n    def trigger_reload(self, filename):\n        # This is called inside an event handler, which means throwing\n        # SystemExit has no effect.\n        # https://github.com/gorakhargosh/watchdog/issues/294\n        self.should_reload = True\n        self.log_reload(filename)\n\n    def run(self):\n        watches = {}\n        observer = self.observer_class()\n        observer.start()\n\n        while not self.should_reload:\n            to_delete = set(watches)\n            paths = _find_observable_paths(self.extra_files)\n            for path in paths:\n                if path not in watches:\n                    try:\n                        watches[path] = observer.schedule(\n                            self.event_handler, path, recursive=True)\n                    except OSError as e:\n                        message = str(e)\n\n                        if message != \"Path is not a directory\":\n                            # Log the exception\n                            _log('error', message)\n\n                        # Clear this path from list of watches We don't want\n                        # the same error message showing again in the next\n                        # iteration.\n                        watches[path] = None\n                to_delete.discard(path)\n            for path in to_delete:\n                watch = watches.pop(path, None)\n                if watch is not None:\n                    observer.unschedule(watch)\n            self.observable_paths = paths\n            self._sleep(self.interval)\n\n        sys.exit(3)\n\n\nreloader_loops = {\n    'stat': StatReloaderLoop,\n    'watchdog': WatchdogReloaderLoop,\n}\n\ntry:\n    __import__('watchdog.observers')\nexcept ImportError:\n    reloader_loops['auto'] = reloader_loops['stat']\nelse:\n    reloader_loops['auto'] = reloader_loops['watchdog']\n\n\ndef run_with_reloader(main_func, extra_files=None, interval=1,\n                      reloader_type='auto'):\n    \"\"\"Run the given function in an independent python interpreter.\"\"\"\n    import signal\n    reloader = reloader_loops[reloader_type](extra_files, interval)\n    signal.signal(signal.SIGTERM, lambda *args: sys.exit(0))\n    try:\n        if os.environ.get('WERKZEUG_RUN_MAIN') == 'true':\n            t = threading.Thread(target=main_func, args=())\n            t.setDaemon(True)\n            t.start()\n            reloader.run()\n        else:\n            sys.exit(reloader.restart_with_reloader())\n    except KeyboardInterrupt:\n        pass\n"
  },
  {
    "path": "lib/werkzeug/contrib/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    werkzeug.contrib\n    ~~~~~~~~~~~~~~~~\n\n    Contains user-submitted code that other users may find useful, but which\n    is not part of the Werkzeug core.  Anyone can write code for inclusion in\n    the `contrib` package.  All modules in this package are distributed as an\n    add-on library and thus are not part of Werkzeug itself.\n\n    This file itself is mostly for informational purposes and to tell the\n    Python interpreter that `contrib` is a package.\n\n    :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\n"
  },
  {
    "path": "lib/werkzeug/contrib/atom.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    werkzeug.contrib.atom\n    ~~~~~~~~~~~~~~~~~~~~~\n\n    This module provides a class called :class:`AtomFeed` which can be\n    used to generate feeds in the Atom syndication format (see :rfc:`4287`).\n\n    Example::\n\n        def atom_feed(request):\n            feed = AtomFeed(\"My Blog\", feed_url=request.url,\n                            url=request.host_url,\n                            subtitle=\"My example blog for a feed test.\")\n            for post in Post.query.limit(10).all():\n                feed.add(post.title, post.body, content_type='html',\n                         author=post.author, url=post.url, id=post.uid,\n                         updated=post.last_update, published=post.pub_date)\n            return feed.get_response()\n\n    :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nfrom datetime import datetime\n\nfrom werkzeug.utils import escape\nfrom werkzeug.wrappers import BaseResponse\nfrom werkzeug._compat import implements_to_string, string_types\n\n\nXHTML_NAMESPACE = 'http://www.w3.org/1999/xhtml'\n\n\ndef _make_text_block(name, content, content_type=None):\n    \"\"\"Helper function for the builder that creates an XML text block.\"\"\"\n    if content_type == 'xhtml':\n        return u'<%s type=\"xhtml\"><div xmlns=\"%s\">%s</div></%s>\\n' % \\\n               (name, XHTML_NAMESPACE, content, name)\n    if not content_type:\n        return u'<%s>%s</%s>\\n' % (name, escape(content), name)\n    return u'<%s type=\"%s\">%s</%s>\\n' % (name, content_type,\n                                         escape(content), name)\n\n\ndef format_iso8601(obj):\n    \"\"\"Format a datetime object for iso8601\"\"\"\n    iso8601 = obj.isoformat()\n    if obj.tzinfo:\n        return iso8601\n    return iso8601 + 'Z'\n\n\n@implements_to_string\nclass AtomFeed(object):\n\n    \"\"\"A helper class that creates Atom feeds.\n\n    :param title: the title of the feed. Required.\n    :param title_type: the type attribute for the title element.  One of\n                       ``'html'``, ``'text'`` or ``'xhtml'``.\n    :param url: the url for the feed (not the url *of* the feed)\n    :param id: a globally unique id for the feed.  Must be an URI.  If\n               not present the `feed_url` is used, but one of both is\n               required.\n    :param updated: the time the feed was modified the last time.  Must\n                    be a :class:`datetime.datetime` object.  If not\n                    present the latest entry's `updated` is used.\n                    Treated as UTC if naive datetime.\n    :param feed_url: the URL to the feed.  Should be the URL that was\n                     requested.\n    :param author: the author of the feed.  Must be either a string (the\n                   name) or a dict with name (required) and uri or\n                   email (both optional).  Can be a list of (may be\n                   mixed, too) strings and dicts, too, if there are\n                   multiple authors. Required if not every entry has an\n                   author element.\n    :param icon: an icon for the feed.\n    :param logo: a logo for the feed.\n    :param rights: copyright information for the feed.\n    :param rights_type: the type attribute for the rights element.  One of\n                        ``'html'``, ``'text'`` or ``'xhtml'``.  Default is\n                        ``'text'``.\n    :param subtitle: a short description of the feed.\n    :param subtitle_type: the type attribute for the subtitle element.\n                          One of ``'text'``, ``'html'``, ``'text'``\n                          or ``'xhtml'``.  Default is ``'text'``.\n    :param links: additional links.  Must be a list of dictionaries with\n                  href (required) and rel, type, hreflang, title, length\n                  (all optional)\n    :param generator: the software that generated this feed.  This must be\n                      a tuple in the form ``(name, url, version)``.  If\n                      you don't want to specify one of them, set the item\n                      to `None`.\n    :param entries: a list with the entries for the feed. Entries can also\n                    be added later with :meth:`add`.\n\n    For more information on the elements see\n    http://www.atomenabled.org/developers/syndication/\n\n    Everywhere where a list is demanded, any iterable can be used.\n    \"\"\"\n\n    default_generator = ('Werkzeug', None, None)\n\n    def __init__(self, title=None, entries=None, **kwargs):\n        self.title = title\n        self.title_type = kwargs.get('title_type', 'text')\n        self.url = kwargs.get('url')\n        self.feed_url = kwargs.get('feed_url', self.url)\n        self.id = kwargs.get('id', self.feed_url)\n        self.updated = kwargs.get('updated')\n        self.author = kwargs.get('author', ())\n        self.icon = kwargs.get('icon')\n        self.logo = kwargs.get('logo')\n        self.rights = kwargs.get('rights')\n        self.rights_type = kwargs.get('rights_type')\n        self.subtitle = kwargs.get('subtitle')\n        self.subtitle_type = kwargs.get('subtitle_type', 'text')\n        self.generator = kwargs.get('generator')\n        if self.generator is None:\n            self.generator = self.default_generator\n        self.links = kwargs.get('links', [])\n        self.entries = entries and list(entries) or []\n\n        if not hasattr(self.author, '__iter__') \\\n           or isinstance(self.author, string_types + (dict,)):\n            self.author = [self.author]\n        for i, author in enumerate(self.author):\n            if not isinstance(author, dict):\n                self.author[i] = {'name': author}\n\n        if not self.title:\n            raise ValueError('title is required')\n        if not self.id:\n            raise ValueError('id is required')\n        for author in self.author:\n            if 'name' not in author:\n                raise TypeError('author must contain at least a name')\n\n    def add(self, *args, **kwargs):\n        \"\"\"Add a new entry to the feed.  This function can either be called\n        with a :class:`FeedEntry` or some keyword and positional arguments\n        that are forwarded to the :class:`FeedEntry` constructor.\n        \"\"\"\n        if len(args) == 1 and not kwargs and isinstance(args[0], FeedEntry):\n            self.entries.append(args[0])\n        else:\n            kwargs['feed_url'] = self.feed_url\n            self.entries.append(FeedEntry(*args, **kwargs))\n\n    def __repr__(self):\n        return '<%s %r (%d entries)>' % (\n            self.__class__.__name__,\n            self.title,\n            len(self.entries)\n        )\n\n    def generate(self):\n        \"\"\"Return a generator that yields pieces of XML.\"\"\"\n        # atom demands either an author element in every entry or a global one\n        if not self.author:\n            if False in map(lambda e: bool(e.author), self.entries):\n                self.author = ({'name': 'Unknown author'},)\n\n        if not self.updated:\n            dates = sorted([entry.updated for entry in self.entries])\n            self.updated = dates and dates[-1] or datetime.utcnow()\n\n        yield u'<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n'\n        yield u'<feed xmlns=\"http://www.w3.org/2005/Atom\">\\n'\n        yield '  ' + _make_text_block('title', self.title, self.title_type)\n        yield u'  <id>%s</id>\\n' % escape(self.id)\n        yield u'  <updated>%s</updated>\\n' % format_iso8601(self.updated)\n        if self.url:\n            yield u'  <link href=\"%s\" />\\n' % escape(self.url)\n        if self.feed_url:\n            yield u'  <link href=\"%s\" rel=\"self\" />\\n' % \\\n                escape(self.feed_url)\n        for link in self.links:\n            yield u'  <link %s/>\\n' % ''.join('%s=\"%s\" ' %\n                                              (k, escape(link[k])) for k in link)\n        for author in self.author:\n            yield u'  <author>\\n'\n            yield u'    <name>%s</name>\\n' % escape(author['name'])\n            if 'uri' in author:\n                yield u'    <uri>%s</uri>\\n' % escape(author['uri'])\n            if 'email' in author:\n                yield '    <email>%s</email>\\n' % escape(author['email'])\n            yield '  </author>\\n'\n        if self.subtitle:\n            yield '  ' + _make_text_block('subtitle', self.subtitle,\n                                          self.subtitle_type)\n        if self.icon:\n            yield u'  <icon>%s</icon>\\n' % escape(self.icon)\n        if self.logo:\n            yield u'  <logo>%s</logo>\\n' % escape(self.logo)\n        if self.rights:\n            yield '  ' + _make_text_block('rights', self.rights,\n                                          self.rights_type)\n        generator_name, generator_url, generator_version = self.generator\n        if generator_name or generator_url or generator_version:\n            tmp = [u'  <generator']\n            if generator_url:\n                tmp.append(u' uri=\"%s\"' % escape(generator_url))\n            if generator_version:\n                tmp.append(u' version=\"%s\"' % escape(generator_version))\n            tmp.append(u'>%s</generator>\\n' % escape(generator_name))\n            yield u''.join(tmp)\n        for entry in self.entries:\n            for line in entry.generate():\n                yield u'  ' + line\n        yield u'</feed>\\n'\n\n    def to_string(self):\n        \"\"\"Convert the feed into a string.\"\"\"\n        return u''.join(self.generate())\n\n    def get_response(self):\n        \"\"\"Return a response object for the feed.\"\"\"\n        return BaseResponse(self.to_string(), mimetype='application/atom+xml')\n\n    def __call__(self, environ, start_response):\n        \"\"\"Use the class as WSGI response object.\"\"\"\n        return self.get_response()(environ, start_response)\n\n    def __str__(self):\n        return self.to_string()\n\n\n@implements_to_string\nclass FeedEntry(object):\n\n    \"\"\"Represents a single entry in a feed.\n\n    :param title: the title of the entry. Required.\n    :param title_type: the type attribute for the title element.  One of\n                       ``'html'``, ``'text'`` or ``'xhtml'``.\n    :param content: the content of the entry.\n    :param content_type: the type attribute for the content element.  One\n                         of ``'html'``, ``'text'`` or ``'xhtml'``.\n    :param summary: a summary of the entry's content.\n    :param summary_type: the type attribute for the summary element.  One\n                         of ``'html'``, ``'text'`` or ``'xhtml'``.\n    :param url: the url for the entry.\n    :param id: a globally unique id for the entry.  Must be an URI.  If\n               not present the URL is used, but one of both is required.\n    :param updated: the time the entry was modified the last time.  Must\n                    be a :class:`datetime.datetime` object.  Treated as\n                    UTC if naive datetime. Required.\n    :param author: the author of the entry.  Must be either a string (the\n                   name) or a dict with name (required) and uri or\n                   email (both optional).  Can be a list of (may be\n                   mixed, too) strings and dicts, too, if there are\n                   multiple authors. Required if the feed does not have an\n                   author element.\n    :param published: the time the entry was initially published.  Must\n                      be a :class:`datetime.datetime` object.  Treated as\n                      UTC if naive datetime.\n    :param rights: copyright information for the entry.\n    :param rights_type: the type attribute for the rights element.  One of\n                        ``'html'``, ``'text'`` or ``'xhtml'``.  Default is\n                        ``'text'``.\n    :param links: additional links.  Must be a list of dictionaries with\n                  href (required) and rel, type, hreflang, title, length\n                  (all optional)\n    :param categories: categories for the entry. Must be a list of dictionaries\n                       with term (required), scheme and label (all optional)\n    :param xml_base: The xml base (url) for this feed item.  If not provided\n                     it will default to the item url.\n\n    For more information on the elements see\n    http://www.atomenabled.org/developers/syndication/\n\n    Everywhere where a list is demanded, any iterable can be used.\n    \"\"\"\n\n    def __init__(self, title=None, content=None, feed_url=None, **kwargs):\n        self.title = title\n        self.title_type = kwargs.get('title_type', 'text')\n        self.content = content\n        self.content_type = kwargs.get('content_type', 'html')\n        self.url = kwargs.get('url')\n        self.id = kwargs.get('id', self.url)\n        self.updated = kwargs.get('updated')\n        self.summary = kwargs.get('summary')\n        self.summary_type = kwargs.get('summary_type', 'html')\n        self.author = kwargs.get('author', ())\n        self.published = kwargs.get('published')\n        self.rights = kwargs.get('rights')\n        self.links = kwargs.get('links', [])\n        self.categories = kwargs.get('categories', [])\n        self.xml_base = kwargs.get('xml_base', feed_url)\n\n        if not hasattr(self.author, '__iter__') \\\n           or isinstance(self.author, string_types + (dict,)):\n            self.author = [self.author]\n        for i, author in enumerate(self.author):\n            if not isinstance(author, dict):\n                self.author[i] = {'name': author}\n\n        if not self.title:\n            raise ValueError('title is required')\n        if not self.id:\n            raise ValueError('id is required')\n        if not self.updated:\n            raise ValueError('updated is required')\n\n    def __repr__(self):\n        return '<%s %r>' % (\n            self.__class__.__name__,\n            self.title\n        )\n\n    def generate(self):\n        \"\"\"Yields pieces of ATOM XML.\"\"\"\n        base = ''\n        if self.xml_base:\n            base = ' xml:base=\"%s\"' % escape(self.xml_base)\n        yield u'<entry%s>\\n' % base\n        yield u'  ' + _make_text_block('title', self.title, self.title_type)\n        yield u'  <id>%s</id>\\n' % escape(self.id)\n        yield u'  <updated>%s</updated>\\n' % format_iso8601(self.updated)\n        if self.published:\n            yield u'  <published>%s</published>\\n' % \\\n                  format_iso8601(self.published)\n        if self.url:\n            yield u'  <link href=\"%s\" />\\n' % escape(self.url)\n        for author in self.author:\n            yield u'  <author>\\n'\n            yield u'    <name>%s</name>\\n' % escape(author['name'])\n            if 'uri' in author:\n                yield u'    <uri>%s</uri>\\n' % escape(author['uri'])\n            if 'email' in author:\n                yield u'    <email>%s</email>\\n' % escape(author['email'])\n            yield u'  </author>\\n'\n        for link in self.links:\n            yield u'  <link %s/>\\n' % ''.join('%s=\"%s\" ' %\n                                              (k, escape(link[k])) for k in link)\n        for category in self.categories:\n            yield u'  <category %s/>\\n' % ''.join('%s=\"%s\" ' %\n                                                  (k, escape(category[k])) for k in category)\n        if self.summary:\n            yield u'  ' + _make_text_block('summary', self.summary,\n                                           self.summary_type)\n        if self.content:\n            yield u'  ' + _make_text_block('content', self.content,\n                                           self.content_type)\n        yield u'</entry>\\n'\n\n    def to_string(self):\n        \"\"\"Convert the feed item into a unicode object.\"\"\"\n        return u''.join(self.generate())\n\n    def __str__(self):\n        return self.to_string()\n"
  },
  {
    "path": "lib/werkzeug/contrib/cache.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    werkzeug.contrib.cache\n    ~~~~~~~~~~~~~~~~~~~~~~\n\n    The main problem with dynamic Web sites is, well, they're dynamic.  Each\n    time a user requests a page, the webserver executes a lot of code, queries\n    the database, renders templates until the visitor gets the page he sees.\n\n    This is a lot more expensive than just loading a file from the file system\n    and sending it to the visitor.\n\n    For most Web applications, this overhead isn't a big deal but once it\n    becomes, you will be glad to have a cache system in place.\n\n    How Caching Works\n    =================\n\n    Caching is pretty simple.  Basically you have a cache object lurking around\n    somewhere that is connected to a remote cache or the file system or\n    something else.  When the request comes in you check if the current page\n    is already in the cache and if so, you're returning it from the cache.\n    Otherwise you generate the page and put it into the cache. (Or a fragment\n    of the page, you don't have to cache the full thing)\n\n    Here is a simple example of how to cache a sidebar for a template::\n\n        def get_sidebar(user):\n            identifier = 'sidebar_for/user%d' % user.id\n            value = cache.get(identifier)\n            if value is not None:\n                return value\n            value = generate_sidebar_for(user=user)\n            cache.set(identifier, value, timeout=60 * 5)\n            return value\n\n    Creating a Cache Object\n    =======================\n\n    To create a cache object you just import the cache system of your choice\n    from the cache module and instantiate it.  Then you can start working\n    with that object:\n\n    >>> from werkzeug.contrib.cache import SimpleCache\n    >>> c = SimpleCache()\n    >>> c.set(\"foo\", \"value\")\n    >>> c.get(\"foo\")\n    'value'\n    >>> c.get(\"missing\") is None\n    True\n\n    Please keep in mind that you have to create the cache and put it somewhere\n    you have access to it (either as a module global you can import or you just\n    put it into your WSGI application).\n\n    :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nimport os\nimport re\nimport errno\nimport tempfile\nfrom hashlib import md5\nfrom time import time\ntry:\n    import cPickle as pickle\nexcept ImportError:  # pragma: no cover\n    import pickle\n\nfrom werkzeug._compat import iteritems, string_types, text_type, \\\n    integer_types, to_native\nfrom werkzeug.posixemulation import rename\n\n\ndef _items(mappingorseq):\n    \"\"\"Wrapper for efficient iteration over mappings represented by dicts\n    or sequences::\n\n        >>> for k, v in _items((i, i*i) for i in xrange(5)):\n        ...    assert k*k == v\n\n        >>> for k, v in _items(dict((i, i*i) for i in xrange(5))):\n        ...    assert k*k == v\n\n    \"\"\"\n    if hasattr(mappingorseq, 'items'):\n        return iteritems(mappingorseq)\n    return mappingorseq\n\n\nclass BaseCache(object):\n\n    \"\"\"Baseclass for the cache systems.  All the cache systems implement this\n    API or a superset of it.\n\n    :param default_timeout: the default timeout (in seconds) that is used if no\n                            timeout is specified on :meth:`set`. A timeout of 0\n                            indicates that the cache never expires.\n    \"\"\"\n\n    def __init__(self, default_timeout=300):\n        self.default_timeout = default_timeout\n\n    def get(self, key):\n        \"\"\"Look up key in the cache and return the value for it.\n\n        :param key: the key to be looked up.\n        :returns: The value if it exists and is readable, else ``None``.\n        \"\"\"\n        return None\n\n    def delete(self, key):\n        \"\"\"Delete `key` from the cache.\n\n        :param key: the key to delete.\n        :returns: Whether the key existed and has been deleted.\n        :rtype: boolean\n        \"\"\"\n        return True\n\n    def get_many(self, *keys):\n        \"\"\"Returns a list of values for the given keys.\n        For each key a item in the list is created::\n\n            foo, bar = cache.get_many(\"foo\", \"bar\")\n\n        Has the same error handling as :meth:`get`.\n\n        :param keys: The function accepts multiple keys as positional\n                     arguments.\n        \"\"\"\n        return map(self.get, keys)\n\n    def get_dict(self, *keys):\n        \"\"\"Like :meth:`get_many` but return a dict::\n\n            d = cache.get_dict(\"foo\", \"bar\")\n            foo = d[\"foo\"]\n            bar = d[\"bar\"]\n\n        :param keys: The function accepts multiple keys as positional\n                     arguments.\n        \"\"\"\n        return dict(zip(keys, self.get_many(*keys)))\n\n    def set(self, key, value, timeout=None):\n        \"\"\"Add a new key/value to the cache (overwrites value, if key already\n        exists in the cache).\n\n        :param key: the key to set\n        :param value: the value for the key\n        :param timeout: the cache timeout for the key (if not specified,\n                        it uses the default timeout). A timeout of 0 idicates\n                        that the cache never expires.\n        :returns: ``True`` if key has been updated, ``False`` for backend\n                  errors. Pickling errors, however, will raise a subclass of\n                  ``pickle.PickleError``.\n        :rtype: boolean\n        \"\"\"\n        return True\n\n    def add(self, key, value, timeout=None):\n        \"\"\"Works like :meth:`set` but does not overwrite the values of already\n        existing keys.\n\n        :param key: the key to set\n        :param value: the value for the key\n        :param timeout: the cache timeout for the key or the default\n                        timeout if not specified. A timeout of 0 indicates\n                        that the cache never expires.\n        :returns: Same as :meth:`set`, but also ``False`` for already\n                  existing keys.\n        :rtype: boolean\n        \"\"\"\n        return True\n\n    def set_many(self, mapping, timeout=None):\n        \"\"\"Sets multiple keys and values from a mapping.\n\n        :param mapping: a mapping with the keys/values to set.\n        :param timeout: the cache timeout for the key (if not specified,\n                        it uses the default timeout). A timeout of 0\n                        indicates tht the cache never expires.\n        :returns: Whether all given keys have been set.\n        :rtype: boolean\n        \"\"\"\n        rv = True\n        for key, value in _items(mapping):\n            if not self.set(key, value, timeout):\n                rv = False\n        return rv\n\n    def delete_many(self, *keys):\n        \"\"\"Deletes multiple keys at once.\n\n        :param keys: The function accepts multiple keys as positional\n                     arguments.\n        :returns: Whether all given keys have been deleted.\n        :rtype: boolean\n        \"\"\"\n        return all(self.delete(key) for key in keys)\n\n    def has(self, key):\n        \"\"\"Checks if a key exists in the cache without returning it. This is a\n        cheap operation that bypasses loading the actual data on the backend.\n\n        This method is optional and may not be implemented on all caches.\n\n        :param key: the key to check\n        \"\"\"\n        raise NotImplementedError(\n            '%s doesn\\'t have an efficient implementation of `has`. That '\n            'means it is impossible to check whether a key exists without '\n            'fully loading the key\\'s data. Consider using `self.get` '\n            'explicitly if you don\\'t care about performance.'\n        )\n\n    def clear(self):\n        \"\"\"Clears the cache.  Keep in mind that not all caches support\n        completely clearing the cache.\n        :returns: Whether the cache has been cleared.\n        :rtype: boolean\n        \"\"\"\n        return True\n\n    def inc(self, key, delta=1):\n        \"\"\"Increments the value of a key by `delta`.  If the key does\n        not yet exist it is initialized with `delta`.\n\n        For supporting caches this is an atomic operation.\n\n        :param key: the key to increment.\n        :param delta: the delta to add.\n        :returns: The new value or ``None`` for backend errors.\n        \"\"\"\n        value = (self.get(key) or 0) + delta\n        return value if self.set(key, value) else None\n\n    def dec(self, key, delta=1):\n        \"\"\"Decrements the value of a key by `delta`.  If the key does\n        not yet exist it is initialized with `-delta`.\n\n        For supporting caches this is an atomic operation.\n\n        :param key: the key to increment.\n        :param delta: the delta to subtract.\n        :returns: The new value or `None` for backend errors.\n        \"\"\"\n        value = (self.get(key) or 0) - delta\n        return value if self.set(key, value) else None\n\n\nclass NullCache(BaseCache):\n\n    \"\"\"A cache that doesn't cache.  This can be useful for unit testing.\n\n    :param default_timeout: a dummy parameter that is ignored but exists\n                            for API compatibility with other caches.\n    \"\"\"\n\n\nclass SimpleCache(BaseCache):\n\n    \"\"\"Simple memory cache for single process environments.  This class exists\n    mainly for the development server and is not 100% thread safe.  It tries\n    to use as many atomic operations as possible and no locks for simplicity\n    but it could happen under heavy load that keys are added multiple times.\n\n    :param threshold: the maximum number of items the cache stores before\n                      it starts deleting some.\n    :param default_timeout: the default timeout that is used if no timeout is\n                            specified on :meth:`~BaseCache.set`. A timeout of\n                            0 indicates that the cache never expires.\n    \"\"\"\n\n    def __init__(self, threshold=500, default_timeout=300):\n        BaseCache.__init__(self, default_timeout)\n        self._cache = {}\n        self.clear = self._cache.clear\n        self._threshold = threshold\n\n    def _prune(self):\n        if len(self._cache) > self._threshold:\n            now = time()\n            toremove = []\n            for idx, (key, (expires, _)) in enumerate(self._cache.items()):\n                if (expires != 0 and expires <= now) or idx % 3 == 0:\n                    toremove.append(key)\n            for key in toremove:\n                self._cache.pop(key, None)\n\n    def _get_expiration(self, timeout):\n        if timeout is None:\n            timeout = self.default_timeout\n        if timeout > 0:\n            timeout = time() + timeout\n        return timeout\n\n    def get(self, key):\n        try:\n            expires, value = self._cache[key]\n            if expires == 0 or expires > time():\n                return pickle.loads(value)\n        except (KeyError, pickle.PickleError):\n            return None\n\n    def set(self, key, value, timeout=None):\n        expires = self._get_expiration(timeout)\n        self._prune()\n        self._cache[key] = (expires, pickle.dumps(value,\n                                                  pickle.HIGHEST_PROTOCOL))\n        return True\n\n    def add(self, key, value, timeout=None):\n        expires = self._get_expiration(timeout)\n        self._prune()\n        item = (expires, pickle.dumps(value,\n                                      pickle.HIGHEST_PROTOCOL))\n        if key in self._cache:\n            return False\n        self._cache.setdefault(key, item)\n        return True\n\n    def delete(self, key):\n        return self._cache.pop(key, None) is not None\n\n    def has(self, key):\n        try:\n            expires, value = self._cache[key]\n            return expires == 0 or expires > time()\n        except KeyError:\n            return False\n\n_test_memcached_key = re.compile(r'[^\\x00-\\x21\\xff]{1,250}$').match\n\n\nclass MemcachedCache(BaseCache):\n\n    \"\"\"A cache that uses memcached as backend.\n\n    The first argument can either be an object that resembles the API of a\n    :class:`memcache.Client` or a tuple/list of server addresses. In the\n    event that a tuple/list is passed, Werkzeug tries to import the best\n    available memcache library.\n\n    This cache looks into the following packages/modules to find bindings for\n    memcached:\n\n        - ``pylibmc``\n        - ``google.appengine.api.memcached``\n        - ``memcached``\n\n    Implementation notes:  This cache backend works around some limitations in\n    memcached to simplify the interface.  For example unicode keys are encoded\n    to utf-8 on the fly.  Methods such as :meth:`~BaseCache.get_dict` return\n    the keys in the same format as passed.  Furthermore all get methods\n    silently ignore key errors to not cause problems when untrusted user data\n    is passed to the get methods which is often the case in web applications.\n\n    :param servers: a list or tuple of server addresses or alternatively\n                    a :class:`memcache.Client` or a compatible client.\n    :param default_timeout: the default timeout that is used if no timeout is\n                            specified on :meth:`~BaseCache.set`. A timeout of\n                            0 indicates taht the cache never expires.\n    :param key_prefix: a prefix that is added before all keys.  This makes it\n                       possible to use the same memcached server for different\n                       applications.  Keep in mind that\n                       :meth:`~BaseCache.clear` will also clear keys with a\n                       different prefix.\n    \"\"\"\n\n    def __init__(self, servers=None, default_timeout=300, key_prefix=None):\n        BaseCache.__init__(self, default_timeout)\n        if servers is None or isinstance(servers, (list, tuple)):\n            if servers is None:\n                servers = ['127.0.0.1:11211']\n            self._client = self.import_preferred_memcache_lib(servers)\n            if self._client is None:\n                raise RuntimeError('no memcache module found')\n        else:\n            # NOTE: servers is actually an already initialized memcache\n            # client.\n            self._client = servers\n\n        self.key_prefix = to_native(key_prefix)\n\n    def _normalize_key(self, key):\n        key = to_native(key, 'utf-8')\n        if self.key_prefix:\n            key = self.key_prefix + key\n        return key\n\n    def _normalize_timeout(self, timeout):\n        if timeout is None:\n            timeout = self.default_timeout\n        if timeout > 0:\n            timeout = int(time()) + timeout\n        return timeout\n\n    def get(self, key):\n        key = self._normalize_key(key)\n        # memcached doesn't support keys longer than that.  Because often\n        # checks for so long keys can occur because it's tested from user\n        # submitted data etc we fail silently for getting.\n        if _test_memcached_key(key):\n            return self._client.get(key)\n\n    def get_dict(self, *keys):\n        key_mapping = {}\n        have_encoded_keys = False\n        for key in keys:\n            encoded_key = self._normalize_key(key)\n            if not isinstance(key, str):\n                have_encoded_keys = True\n            if _test_memcached_key(key):\n                key_mapping[encoded_key] = key\n        d = rv = self._client.get_multi(key_mapping.keys())\n        if have_encoded_keys or self.key_prefix:\n            rv = {}\n            for key, value in iteritems(d):\n                rv[key_mapping[key]] = value\n        if len(rv) < len(keys):\n            for key in keys:\n                if key not in rv:\n                    rv[key] = None\n        return rv\n\n    def add(self, key, value, timeout=None):\n        key = self._normalize_key(key)\n        timeout = self._normalize_timeout(timeout)\n        return self._client.add(key, value, timeout)\n\n    def set(self, key, value, timeout=None):\n        key = self._normalize_key(key)\n        timeout = self._normalize_timeout(timeout)\n        return self._client.set(key, value, timeout)\n\n    def get_many(self, *keys):\n        d = self.get_dict(*keys)\n        return [d[key] for key in keys]\n\n    def set_many(self, mapping, timeout=None):\n        new_mapping = {}\n        for key, value in _items(mapping):\n            key = self._normalize_key(key)\n            new_mapping[key] = value\n\n        timeout = self._normalize_timeout(timeout)\n        failed_keys = self._client.set_multi(new_mapping, timeout)\n        return not failed_keys\n\n    def delete(self, key):\n        key = self._normalize_key(key)\n        if _test_memcached_key(key):\n            return self._client.delete(key)\n\n    def delete_many(self, *keys):\n        new_keys = []\n        for key in keys:\n            key = self._normalize_key(key)\n            if _test_memcached_key(key):\n                new_keys.append(key)\n        return self._client.delete_multi(new_keys)\n\n    def has(self, key):\n        key = self._normalize_key(key)\n        if _test_memcached_key(key):\n            return self._client.append(key, '')\n        return False\n\n    def clear(self):\n        return self._client.flush_all()\n\n    def inc(self, key, delta=1):\n        key = self._normalize_key(key)\n        return self._client.incr(key, delta)\n\n    def dec(self, key, delta=1):\n        key = self._normalize_key(key)\n        return self._client.decr(key, delta)\n\n    def import_preferred_memcache_lib(self, servers):\n        \"\"\"Returns an initialized memcache client.  Used by the constructor.\"\"\"\n        try:\n            import pylibmc\n        except ImportError:\n            pass\n        else:\n            return pylibmc.Client(servers)\n\n        try:\n            from google.appengine.api import memcache\n        except ImportError:\n            pass\n        else:\n            return memcache.Client()\n\n        try:\n            import memcache\n        except ImportError:\n            pass\n        else:\n            return memcache.Client(servers)\n\n\n# backwards compatibility\nGAEMemcachedCache = MemcachedCache\n\n\nclass RedisCache(BaseCache):\n\n    \"\"\"Uses the Redis key-value store as a cache backend.\n\n    The first argument can be either a string denoting address of the Redis\n    server or an object resembling an instance of a redis.Redis class.\n\n    Note: Python Redis API already takes care of encoding unicode strings on\n    the fly.\n\n    .. versionadded:: 0.7\n\n    .. versionadded:: 0.8\n       `key_prefix` was added.\n\n    .. versionchanged:: 0.8\n       This cache backend now properly serializes objects.\n\n    .. versionchanged:: 0.8.3\n       This cache backend now supports password authentication.\n\n    .. versionchanged:: 0.10\n        ``**kwargs`` is now passed to the redis object.\n\n    :param host: address of the Redis server or an object which API is\n                 compatible with the official Python Redis client (redis-py).\n    :param port: port number on which Redis server listens for connections.\n    :param password: password authentication for the Redis server.\n    :param db: db (zero-based numeric index) on Redis Server to connect.\n    :param default_timeout: the default timeout that is used if no timeout is\n                            specified on :meth:`~BaseCache.set`. A timeout of\n                            0 indicates that the cache never expires.\n    :param key_prefix: A prefix that should be added to all keys.\n\n    Any additional keyword arguments will be passed to ``redis.Redis``.\n    \"\"\"\n\n    def __init__(self, host='localhost', port=6379, password=None,\n                 db=0, default_timeout=300, key_prefix=None, **kwargs):\n        BaseCache.__init__(self, default_timeout)\n        if isinstance(host, string_types):\n            try:\n                import redis\n            except ImportError:\n                raise RuntimeError('no redis module found')\n            if kwargs.get('decode_responses', None):\n                raise ValueError('decode_responses is not supported by '\n                                 'RedisCache.')\n            self._client = redis.Redis(host=host, port=port, password=password,\n                                       db=db, **kwargs)\n        else:\n            self._client = host\n        self.key_prefix = key_prefix or ''\n\n    def _get_expiration(self, timeout):\n        if timeout is None:\n            timeout = self.default_timeout\n        if timeout == 0:\n            timeout = -1\n        return timeout\n\n    def dump_object(self, value):\n        \"\"\"Dumps an object into a string for redis.  By default it serializes\n        integers as regular string and pickle dumps everything else.\n        \"\"\"\n        t = type(value)\n        if t in integer_types:\n            return str(value).encode('ascii')\n        return b'!' + pickle.dumps(value)\n\n    def load_object(self, value):\n        \"\"\"The reversal of :meth:`dump_object`.  This might be called with\n        None.\n        \"\"\"\n        if value is None:\n            return None\n        if value.startswith(b'!'):\n            try:\n                return pickle.loads(value[1:])\n            except pickle.PickleError:\n                return None\n        try:\n            return int(value)\n        except ValueError:\n            # before 0.8 we did not have serialization.  Still support that.\n            return value\n\n    def get(self, key):\n        return self.load_object(self._client.get(self.key_prefix + key))\n\n    def get_many(self, *keys):\n        if self.key_prefix:\n            keys = [self.key_prefix + key for key in keys]\n        return [self.load_object(x) for x in self._client.mget(keys)]\n\n    def set(self, key, value, timeout=None):\n        timeout = self._get_expiration(timeout)\n        dump = self.dump_object(value)\n        if timeout == -1:\n            result = self._client.set(name=self.key_prefix + key,\n                                      value=dump)\n        else:\n            result = self._client.setex(name=self.key_prefix + key,\n                                        value=dump, time=timeout)\n        return result\n\n    def add(self, key, value, timeout=None):\n        timeout = self._get_expiration(timeout)\n        dump = self.dump_object(value)\n        return (\n            self._client.setnx(name=self.key_prefix + key, value=dump) and\n            self._client.expire(name=self.key_prefix + key, time=timeout)\n        )\n\n    def set_many(self, mapping, timeout=None):\n        timeout = self._get_expiration(timeout)\n        # Use transaction=False to batch without calling redis MULTI\n        # which is not supported by twemproxy\n        pipe = self._client.pipeline(transaction=False)\n\n        for key, value in _items(mapping):\n            dump = self.dump_object(value)\n            if timeout == -1:\n                pipe.set(name=self.key_prefix + key, value=dump)\n            else:\n                pipe.setex(name=self.key_prefix + key, value=dump,\n                           time=timeout)\n        return pipe.execute()\n\n    def delete(self, key):\n        return self._client.delete(self.key_prefix + key)\n\n    def delete_many(self, *keys):\n        if not keys:\n            return\n        if self.key_prefix:\n            keys = [self.key_prefix + key for key in keys]\n        return self._client.delete(*keys)\n\n    def has(self, key):\n        return self._client.exists(self.key_prefix + key)\n\n    def clear(self):\n        status = False\n        if self.key_prefix:\n            keys = self._client.keys(self.key_prefix + '*')\n            if keys:\n                status = self._client.delete(*keys)\n        else:\n            status = self._client.flushdb()\n        return status\n\n    def inc(self, key, delta=1):\n        return self._client.incr(name=self.key_prefix + key, amount=delta)\n\n    def dec(self, key, delta=1):\n        return self._client.decr(name=self.key_prefix + key, amount=delta)\n\n\nclass FileSystemCache(BaseCache):\n\n    \"\"\"A cache that stores the items on the file system.  This cache depends\n    on being the only user of the `cache_dir`.  Make absolutely sure that\n    nobody but this cache stores files there or otherwise the cache will\n    randomly delete files therein.\n\n    :param cache_dir: the directory where cache files are stored.\n    :param threshold: the maximum number of items the cache stores before\n                      it starts deleting some.\n    :param default_timeout: the default timeout that is used if no timeout is\n                            specified on :meth:`~BaseCache.set`. A timeout of\n                            0 indicates that the cache never expires.\n    :param mode: the file mode wanted for the cache files, default 0600\n    \"\"\"\n\n    #: used for temporary files by the FileSystemCache\n    _fs_transaction_suffix = '.__wz_cache'\n\n    def __init__(self, cache_dir, threshold=500, default_timeout=300,\n                 mode=0o600):\n        BaseCache.__init__(self, default_timeout)\n        self._path = cache_dir\n        self._threshold = threshold\n        self._mode = mode\n\n        try:\n            os.makedirs(self._path)\n        except OSError as ex:\n            if ex.errno != errno.EEXIST:\n                raise\n\n    def _list_dir(self):\n        \"\"\"return a list of (fully qualified) cache filenames\n        \"\"\"\n        return [os.path.join(self._path, fn) for fn in os.listdir(self._path)\n                if not fn.endswith(self._fs_transaction_suffix)]\n\n    def _prune(self):\n        entries = self._list_dir()\n        if len(entries) > self._threshold:\n            now = time()\n            try:\n                for idx, fname in enumerate(entries):\n                    remove = False\n                    with open(fname, 'rb') as f:\n                        expires = pickle.load(f)\n                    remove = (expires != 0 and expires <= now) or idx % 3 == 0\n\n                    if remove:\n                        os.remove(fname)\n            except (IOError, OSError):\n                pass\n\n    def clear(self):\n        for fname in self._list_dir():\n            try:\n                os.remove(fname)\n            except (IOError, OSError):\n                return False\n        return True\n\n    def _get_filename(self, key):\n        if isinstance(key, text_type):\n            key = key.encode('utf-8')  # XXX unicode review\n        hash = md5(key).hexdigest()\n        return os.path.join(self._path, hash)\n\n    def get(self, key):\n        filename = self._get_filename(key)\n        try:\n            with open(filename, 'rb') as f:\n                pickle_time = pickle.load(f)\n                if pickle_time == 0 or pickle_time >= time():\n                    return pickle.load(f)\n                else:\n                    os.remove(filename)\n                    return None\n        except (IOError, OSError, pickle.PickleError):\n            return None\n\n    def add(self, key, value, timeout=None):\n        filename = self._get_filename(key)\n        if not os.path.exists(filename):\n            return self.set(key, value, timeout)\n        return False\n\n    def set(self, key, value, timeout=None):\n        if timeout is None:\n            timeout = int(time() + self.default_timeout)\n        elif timeout != 0:\n            timeout = int(time() + timeout)\n        filename = self._get_filename(key)\n        self._prune()\n        try:\n            fd, tmp = tempfile.mkstemp(suffix=self._fs_transaction_suffix,\n                                       dir=self._path)\n            with os.fdopen(fd, 'wb') as f:\n                pickle.dump(timeout, f, 1)\n                pickle.dump(value, f, pickle.HIGHEST_PROTOCOL)\n            rename(tmp, filename)\n            os.chmod(filename, self._mode)\n        except (IOError, OSError):\n            return False\n        else:\n            return True\n\n    def delete(self, key):\n        try:\n            os.remove(self._get_filename(key))\n        except (IOError, OSError):\n            return False\n        else:\n            return True\n\n    def has(self, key):\n        filename = self._get_filename(key)\n        try:\n            with open(filename, 'rb') as f:\n                pickle_time = pickle.load(f)\n                if pickle_time == 0 or pickle_time >= time():\n                    return True\n                else:\n                    os.remove(filename)\n                    return False\n        except (IOError, OSError, pickle.PickleError):\n            return False\n"
  },
  {
    "path": "lib/werkzeug/contrib/fixers.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    werkzeug.contrib.fixers\n    ~~~~~~~~~~~~~~~~~~~~~~~\n\n    .. versionadded:: 0.5\n\n    This module includes various helpers that fix bugs in web servers.  They may\n    be necessary for some versions of a buggy web server but not others.  We try\n    to stay updated with the status of the bugs as good as possible but you have\n    to make sure whether they fix the problem you encounter.\n\n    If you notice bugs in webservers not fixed in this module consider\n    contributing a patch.\n\n    :copyright: Copyright 2009 by the Werkzeug Team, see AUTHORS for more details.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\ntry:\n    from urllib import unquote\nexcept ImportError:\n    from urllib.parse import unquote\n\nfrom werkzeug.http import parse_options_header, parse_cache_control_header, \\\n    parse_set_header\nfrom werkzeug.useragents import UserAgent\nfrom werkzeug.datastructures import Headers, ResponseCacheControl\n\n\nclass CGIRootFix(object):\n\n    \"\"\"Wrap the application in this middleware if you are using FastCGI or CGI\n    and you have problems with your app root being set to the cgi script's path\n    instead of the path users are going to visit\n\n    .. versionchanged:: 0.9\n       Added `app_root` parameter and renamed from `LighttpdCGIRootFix`.\n\n    :param app: the WSGI application\n    :param app_root: Defaulting to ``'/'``, you can set this to something else\n        if your app is mounted somewhere else.\n    \"\"\"\n\n    def __init__(self, app, app_root='/'):\n        self.app = app\n        self.app_root = app_root\n\n    def __call__(self, environ, start_response):\n        # only set PATH_INFO for older versions of Lighty or if no\n        # server software is provided.  That's because the test was\n        # added in newer Werkzeug versions and we don't want to break\n        # people's code if they are using this fixer in a test that\n        # does not set the SERVER_SOFTWARE key.\n        if 'SERVER_SOFTWARE' not in environ or \\\n           environ['SERVER_SOFTWARE'] < 'lighttpd/1.4.28':\n            environ['PATH_INFO'] = environ.get('SCRIPT_NAME', '') + \\\n                environ.get('PATH_INFO', '')\n        environ['SCRIPT_NAME'] = self.app_root.strip('/')\n        return self.app(environ, start_response)\n\n# backwards compatibility\nLighttpdCGIRootFix = CGIRootFix\n\n\nclass PathInfoFromRequestUriFix(object):\n\n    \"\"\"On windows environment variables are limited to the system charset\n    which makes it impossible to store the `PATH_INFO` variable in the\n    environment without loss of information on some systems.\n\n    This is for example a problem for CGI scripts on a Windows Apache.\n\n    This fixer works by recreating the `PATH_INFO` from `REQUEST_URI`,\n    `REQUEST_URL`, or `UNENCODED_URL` (whatever is available).  Thus the\n    fix can only be applied if the webserver supports either of these\n    variables.\n\n    :param app: the WSGI application\n    \"\"\"\n\n    def __init__(self, app):\n        self.app = app\n\n    def __call__(self, environ, start_response):\n        for key in 'REQUEST_URL', 'REQUEST_URI', 'UNENCODED_URL':\n            if key not in environ:\n                continue\n            request_uri = unquote(environ[key])\n            script_name = unquote(environ.get('SCRIPT_NAME', ''))\n            if request_uri.startswith(script_name):\n                environ['PATH_INFO'] = request_uri[len(script_name):] \\\n                    .split('?', 1)[0]\n                break\n        return self.app(environ, start_response)\n\n\nclass ProxyFix(object):\n\n    \"\"\"This middleware can be applied to add HTTP proxy support to an\n    application that was not designed with HTTP proxies in mind.  It\n    sets `REMOTE_ADDR`, `HTTP_HOST` from `X-Forwarded` headers.  While\n    Werkzeug-based applications already can use\n    :py:func:`werkzeug.wsgi.get_host` to retrieve the current host even if\n    behind proxy setups, this middleware can be used for applications which\n    access the WSGI environment directly.\n\n    If you have more than one proxy server in front of your app, set\n    `num_proxies` accordingly.\n\n    Do not use this middleware in non-proxy setups for security reasons.\n\n    The original values of `REMOTE_ADDR` and `HTTP_HOST` are stored in\n    the WSGI environment as `werkzeug.proxy_fix.orig_remote_addr` and\n    `werkzeug.proxy_fix.orig_http_host`.\n\n    :param app: the WSGI application\n    :param num_proxies: the number of proxy servers in front of the app.\n    \"\"\"\n\n    def __init__(self, app, num_proxies=1):\n        self.app = app\n        self.num_proxies = num_proxies\n\n    def get_remote_addr(self, forwarded_for):\n        \"\"\"Selects the new remote addr from the given list of ips in\n        X-Forwarded-For.  By default it picks the one that the `num_proxies`\n        proxy server provides.  Before 0.9 it would always pick the first.\n\n        .. versionadded:: 0.8\n        \"\"\"\n        if len(forwarded_for) >= self.num_proxies:\n            return forwarded_for[-1 * self.num_proxies]\n\n    def __call__(self, environ, start_response):\n        getter = environ.get\n        forwarded_proto = getter('HTTP_X_FORWARDED_PROTO', '')\n        forwarded_for = getter('HTTP_X_FORWARDED_FOR', '').split(',')\n        forwarded_host = getter('HTTP_X_FORWARDED_HOST', '')\n        environ.update({\n            'werkzeug.proxy_fix.orig_wsgi_url_scheme':  getter('wsgi.url_scheme'),\n            'werkzeug.proxy_fix.orig_remote_addr':      getter('REMOTE_ADDR'),\n            'werkzeug.proxy_fix.orig_http_host':        getter('HTTP_HOST')\n        })\n        forwarded_for = [x for x in [x.strip() for x in forwarded_for] if x]\n        remote_addr = self.get_remote_addr(forwarded_for)\n        if remote_addr is not None:\n            environ['REMOTE_ADDR'] = remote_addr\n        if forwarded_host:\n            environ['HTTP_HOST'] = forwarded_host\n        if forwarded_proto:\n            environ['wsgi.url_scheme'] = forwarded_proto\n        return self.app(environ, start_response)\n\n\nclass HeaderRewriterFix(object):\n\n    \"\"\"This middleware can remove response headers and add others.  This\n    is for example useful to remove the `Date` header from responses if you\n    are using a server that adds that header, no matter if it's present or\n    not or to add `X-Powered-By` headers::\n\n        app = HeaderRewriterFix(app, remove_headers=['Date'],\n                                add_headers=[('X-Powered-By', 'WSGI')])\n\n    :param app: the WSGI application\n    :param remove_headers: a sequence of header keys that should be\n                           removed.\n    :param add_headers: a sequence of ``(key, value)`` tuples that should\n                        be added.\n    \"\"\"\n\n    def __init__(self, app, remove_headers=None, add_headers=None):\n        self.app = app\n        self.remove_headers = set(x.lower() for x in (remove_headers or ()))\n        self.add_headers = list(add_headers or ())\n\n    def __call__(self, environ, start_response):\n        def rewriting_start_response(status, headers, exc_info=None):\n            new_headers = []\n            for key, value in headers:\n                if key.lower() not in self.remove_headers:\n                    new_headers.append((key, value))\n            new_headers += self.add_headers\n            return start_response(status, new_headers, exc_info)\n        return self.app(environ, rewriting_start_response)\n\n\nclass InternetExplorerFix(object):\n\n    \"\"\"This middleware fixes a couple of bugs with Microsoft Internet\n    Explorer.  Currently the following fixes are applied:\n\n    -   removing of `Vary` headers for unsupported mimetypes which\n        causes troubles with caching.  Can be disabled by passing\n        ``fix_vary=False`` to the constructor.\n        see: http://support.microsoft.com/kb/824847/en-us\n\n    -   removes offending headers to work around caching bugs in\n        Internet Explorer if `Content-Disposition` is set.  Can be\n        disabled by passing ``fix_attach=False`` to the constructor.\n\n    If it does not detect affected Internet Explorer versions it won't touch\n    the request / response.\n    \"\"\"\n\n    # This code was inspired by Django fixers for the same bugs.  The\n    # fix_vary and fix_attach fixers were originally implemented in Django\n    # by Michael Axiak and is available as part of the Django project:\n    #     http://code.djangoproject.com/ticket/4148\n\n    def __init__(self, app, fix_vary=True, fix_attach=True):\n        self.app = app\n        self.fix_vary = fix_vary\n        self.fix_attach = fix_attach\n\n    def fix_headers(self, environ, headers, status=None):\n        if self.fix_vary:\n            header = headers.get('content-type', '')\n            mimetype, options = parse_options_header(header)\n            if mimetype not in ('text/html', 'text/plain', 'text/sgml'):\n                headers.pop('vary', None)\n\n        if self.fix_attach and 'content-disposition' in headers:\n            pragma = parse_set_header(headers.get('pragma', ''))\n            pragma.discard('no-cache')\n            header = pragma.to_header()\n            if not header:\n                headers.pop('pragma', '')\n            else:\n                headers['Pragma'] = header\n            header = headers.get('cache-control', '')\n            if header:\n                cc = parse_cache_control_header(header,\n                                                cls=ResponseCacheControl)\n                cc.no_cache = None\n                cc.no_store = False\n                header = cc.to_header()\n                if not header:\n                    headers.pop('cache-control', '')\n                else:\n                    headers['Cache-Control'] = header\n\n    def run_fixed(self, environ, start_response):\n        def fixing_start_response(status, headers, exc_info=None):\n            headers = Headers(headers)\n            self.fix_headers(environ, headers, status)\n            return start_response(status, headers.to_wsgi_list(), exc_info)\n        return self.app(environ, fixing_start_response)\n\n    def __call__(self, environ, start_response):\n        ua = UserAgent(environ)\n        if ua.browser != 'msie':\n            return self.app(environ, start_response)\n        return self.run_fixed(environ, start_response)\n"
  },
  {
    "path": "lib/werkzeug/contrib/iterio.py",
    "content": "# -*- coding: utf-8 -*-\nr\"\"\"\n    werkzeug.contrib.iterio\n    ~~~~~~~~~~~~~~~~~~~~~~~\n\n    This module implements a :class:`IterIO` that converts an iterator into\n    a stream object and the other way round.  Converting streams into\n    iterators requires the `greenlet`_ module.\n\n    To convert an iterator into a stream all you have to do is to pass it\n    directly to the :class:`IterIO` constructor.  In this example we pass it\n    a newly created generator::\n\n        def foo():\n            yield \"something\\n\"\n            yield \"otherthings\"\n        stream = IterIO(foo())\n        print stream.read()         # read the whole iterator\n\n    The other way round works a bit different because we have to ensure that\n    the code execution doesn't take place yet.  An :class:`IterIO` call with a\n    callable as first argument does two things.  The function itself is passed\n    an :class:`IterIO` stream it can feed.  The object returned by the\n    :class:`IterIO` constructor on the other hand is not an stream object but\n    an iterator::\n\n        def foo(stream):\n            stream.write(\"some\")\n            stream.write(\"thing\")\n            stream.flush()\n            stream.write(\"otherthing\")\n        iterator = IterIO(foo)\n        print iterator.next()       # prints something\n        print iterator.next()       # prints otherthing\n        iterator.next()             # raises StopIteration\n\n    .. _greenlet: http://codespeak.net/py/dist/greenlet.html\n\n    :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\ntry:\n    import greenlet\nexcept ImportError:\n    greenlet = None\n\nfrom werkzeug._compat import implements_iterator\n\n\ndef _mixed_join(iterable, sentinel):\n    \"\"\"concatenate any string type in an intelligent way.\"\"\"\n    iterator = iter(iterable)\n    first_item = next(iterator, sentinel)\n    if isinstance(first_item, bytes):\n        return first_item + b''.join(iterator)\n    return first_item + u''.join(iterator)\n\n\ndef _newline(reference_string):\n    if isinstance(reference_string, bytes):\n        return b'\\n'\n    return u'\\n'\n\n\n@implements_iterator\nclass IterIO(object):\n\n    \"\"\"Instances of this object implement an interface compatible with the\n    standard Python :class:`file` object.  Streams are either read-only or\n    write-only depending on how the object is created.\n\n    If the first argument is an iterable a file like object is returned that\n    returns the contents of the iterable.  In case the iterable is empty\n    read operations will return the sentinel value.\n\n    If the first argument is a callable then the stream object will be\n    created and passed to that function.  The caller itself however will\n    not receive a stream but an iterable.  The function will be be executed\n    step by step as something iterates over the returned iterable.  Each\n    call to :meth:`flush` will create an item for the iterable.  If\n    :meth:`flush` is called without any writes in-between the sentinel\n    value will be yielded.\n\n    Note for Python 3: due to the incompatible interface of bytes and\n    streams you should set the sentinel value explicitly to an empty\n    bytestring (``b''``) if you are expecting to deal with bytes as\n    otherwise the end of the stream is marked with the wrong sentinel\n    value.\n\n    .. versionadded:: 0.9\n       `sentinel` parameter was added.\n    \"\"\"\n\n    def __new__(cls, obj, sentinel=''):\n        try:\n            iterator = iter(obj)\n        except TypeError:\n            return IterI(obj, sentinel)\n        return IterO(iterator, sentinel)\n\n    def __iter__(self):\n        return self\n\n    def tell(self):\n        if self.closed:\n            raise ValueError('I/O operation on closed file')\n        return self.pos\n\n    def isatty(self):\n        if self.closed:\n            raise ValueError('I/O operation on closed file')\n        return False\n\n    def seek(self, pos, mode=0):\n        if self.closed:\n            raise ValueError('I/O operation on closed file')\n        raise IOError(9, 'Bad file descriptor')\n\n    def truncate(self, size=None):\n        if self.closed:\n            raise ValueError('I/O operation on closed file')\n        raise IOError(9, 'Bad file descriptor')\n\n    def write(self, s):\n        if self.closed:\n            raise ValueError('I/O operation on closed file')\n        raise IOError(9, 'Bad file descriptor')\n\n    def writelines(self, list):\n        if self.closed:\n            raise ValueError('I/O operation on closed file')\n        raise IOError(9, 'Bad file descriptor')\n\n    def read(self, n=-1):\n        if self.closed:\n            raise ValueError('I/O operation on closed file')\n        raise IOError(9, 'Bad file descriptor')\n\n    def readlines(self, sizehint=0):\n        if self.closed:\n            raise ValueError('I/O operation on closed file')\n        raise IOError(9, 'Bad file descriptor')\n\n    def readline(self, length=None):\n        if self.closed:\n            raise ValueError('I/O operation on closed file')\n        raise IOError(9, 'Bad file descriptor')\n\n    def flush(self):\n        if self.closed:\n            raise ValueError('I/O operation on closed file')\n        raise IOError(9, 'Bad file descriptor')\n\n    def __next__(self):\n        if self.closed:\n            raise StopIteration()\n        line = self.readline()\n        if not line:\n            raise StopIteration()\n        return line\n\n\nclass IterI(IterIO):\n\n    \"\"\"Convert an stream into an iterator.\"\"\"\n\n    def __new__(cls, func, sentinel=''):\n        if greenlet is None:\n            raise RuntimeError('IterI requires greenlet support')\n        stream = object.__new__(cls)\n        stream._parent = greenlet.getcurrent()\n        stream._buffer = []\n        stream.closed = False\n        stream.sentinel = sentinel\n        stream.pos = 0\n\n        def run():\n            func(stream)\n            stream.close()\n\n        g = greenlet.greenlet(run, stream._parent)\n        while 1:\n            rv = g.switch()\n            if not rv:\n                return\n            yield rv[0]\n\n    def close(self):\n        if not self.closed:\n            self.closed = True\n            self._flush_impl()\n\n    def write(self, s):\n        if self.closed:\n            raise ValueError('I/O operation on closed file')\n        if s:\n            self.pos += len(s)\n            self._buffer.append(s)\n\n    def writelines(self, list):\n        for item in list:\n            self.write(item)\n\n    def flush(self):\n        if self.closed:\n            raise ValueError('I/O operation on closed file')\n        self._flush_impl()\n\n    def _flush_impl(self):\n        data = _mixed_join(self._buffer, self.sentinel)\n        self._buffer = []\n        if not data and self.closed:\n            self._parent.switch()\n        else:\n            self._parent.switch((data,))\n\n\nclass IterO(IterIO):\n\n    \"\"\"Iter output.  Wrap an iterator and give it a stream like interface.\"\"\"\n\n    def __new__(cls, gen, sentinel=''):\n        self = object.__new__(cls)\n        self._gen = gen\n        self._buf = None\n        self.sentinel = sentinel\n        self.closed = False\n        self.pos = 0\n        return self\n\n    def __iter__(self):\n        return self\n\n    def _buf_append(self, string):\n        '''Replace string directly without appending to an empty string,\n        avoiding type issues.'''\n        if not self._buf:\n            self._buf = string\n        else:\n            self._buf += string\n\n    def close(self):\n        if not self.closed:\n            self.closed = True\n            if hasattr(self._gen, 'close'):\n                self._gen.close()\n\n    def seek(self, pos, mode=0):\n        if self.closed:\n            raise ValueError('I/O operation on closed file')\n        if mode == 1:\n            pos += self.pos\n        elif mode == 2:\n            self.read()\n            self.pos = min(self.pos, self.pos + pos)\n            return\n        elif mode != 0:\n            raise IOError('Invalid argument')\n        buf = []\n        try:\n            tmp_end_pos = len(self._buf)\n            while pos > tmp_end_pos:\n                item = self._gen.next()\n                tmp_end_pos += len(item)\n                buf.append(item)\n        except StopIteration:\n            pass\n        if buf:\n            self._buf_append(_mixed_join(buf, self.sentinel))\n        self.pos = max(0, pos)\n\n    def read(self, n=-1):\n        if self.closed:\n            raise ValueError('I/O operation on closed file')\n        if n < 0:\n            self._buf_append(_mixed_join(self._gen, self.sentinel))\n            result = self._buf[self.pos:]\n            self.pos += len(result)\n            return result\n        new_pos = self.pos + n\n        buf = []\n        try:\n            tmp_end_pos = 0 if self._buf is None else len(self._buf)\n            while new_pos > tmp_end_pos or (self._buf is None and not buf):\n                item = next(self._gen)\n                tmp_end_pos += len(item)\n                buf.append(item)\n        except StopIteration:\n            pass\n        if buf:\n            self._buf_append(_mixed_join(buf, self.sentinel))\n\n        if self._buf is None:\n            return self.sentinel\n\n        new_pos = max(0, new_pos)\n        try:\n            return self._buf[self.pos:new_pos]\n        finally:\n            self.pos = min(new_pos, len(self._buf))\n\n    def readline(self, length=None):\n        if self.closed:\n            raise ValueError('I/O operation on closed file')\n\n        nl_pos = -1\n        if self._buf:\n            nl_pos = self._buf.find(_newline(self._buf), self.pos)\n        buf = []\n        try:\n            if self._buf is None:\n                pos = self.pos\n            else:\n                pos = len(self._buf)\n            while nl_pos < 0:\n                item = next(self._gen)\n                local_pos = item.find(_newline(item))\n                buf.append(item)\n                if local_pos >= 0:\n                    nl_pos = pos + local_pos\n                    break\n                pos += len(item)\n        except StopIteration:\n            pass\n        if buf:\n            self._buf_append(_mixed_join(buf, self.sentinel))\n\n        if self._buf is None:\n            return self.sentinel\n\n        if nl_pos < 0:\n            new_pos = len(self._buf)\n        else:\n            new_pos = nl_pos + 1\n        if length is not None and self.pos + length < new_pos:\n            new_pos = self.pos + length\n        try:\n            return self._buf[self.pos:new_pos]\n        finally:\n            self.pos = min(new_pos, len(self._buf))\n\n    def readlines(self, sizehint=0):\n        total = 0\n        lines = []\n        line = self.readline()\n        while line:\n            lines.append(line)\n            total += len(line)\n            if 0 < sizehint <= total:\n                break\n            line = self.readline()\n        return lines\n"
  },
  {
    "path": "lib/werkzeug/contrib/jsrouting.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    werkzeug.contrib.jsrouting\n    ~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n    Addon module that allows to create a JavaScript function from a map\n    that generates rules.\n\n    :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\ntry:\n    from simplejson import dumps\nexcept ImportError:\n    try:\n        from json import dumps\n    except ImportError:\n        def dumps(*args):\n            raise RuntimeError('simplejson required for jsrouting')\n\nfrom inspect import getmro\nfrom werkzeug.routing import NumberConverter\nfrom werkzeug._compat import iteritems\n\n\ndef render_template(name_parts, rules, converters):\n    result = u''\n    if name_parts:\n        for idx in range(0, len(name_parts) - 1):\n            name = u'.'.join(name_parts[:idx + 1])\n            result += u\"if (typeof %s === 'undefined') %s = {}\\n\" % (name, name)\n        result += '%s = ' % '.'.join(name_parts)\n    result += \"\"\"(function (server_name, script_name, subdomain, url_scheme) {\n    var converters = [%(converters)s];\n    var rules = %(rules)s;\n    function in_array(array, value) {\n        if (array.indexOf != undefined) {\n            return array.indexOf(value) != -1;\n        }\n        for (var i = 0; i < array.length; i++) {\n            if (array[i] == value) {\n                return true;\n            }\n        }\n        return false;\n    }\n    function array_diff(array1, array2) {\n        array1 = array1.slice();\n        for (var i = array1.length-1; i >= 0; i--) {\n            if (in_array(array2, array1[i])) {\n                array1.splice(i, 1);\n            }\n        }\n        return array1;\n    }\n    function split_obj(obj) {\n        var names = [];\n        var values = [];\n        for (var name in obj) {\n            if (typeof(obj[name]) != 'function') {\n                names.push(name);\n                values.push(obj[name]);\n            }\n        }\n        return {names: names, values: values, original: obj};\n    }\n    function suitable(rule, args) {\n        var default_args = split_obj(rule.defaults || {});\n        var diff_arg_names = array_diff(rule.arguments, default_args.names);\n\n        for (var i = 0; i < diff_arg_names.length; i++) {\n            if (!in_array(args.names, diff_arg_names[i])) {\n                return false;\n            }\n        }\n\n        if (array_diff(rule.arguments, args.names).length == 0) {\n            if (rule.defaults == null) {\n                return true;\n            }\n            for (var i = 0; i < default_args.names.length; i++) {\n                var key = default_args.names[i];\n                var value = default_args.values[i];\n                if (value != args.original[key]) {\n                    return false;\n                }\n            }\n        }\n\n        return true;\n    }\n    function build(rule, args) {\n        var tmp = [];\n        var processed = rule.arguments.slice();\n        for (var i = 0; i < rule.trace.length; i++) {\n            var part = rule.trace[i];\n            if (part.is_dynamic) {\n                var converter = converters[rule.converters[part.data]];\n                var data = converter(args.original[part.data]);\n                if (data == null) {\n                    return null;\n                }\n                tmp.push(data);\n                processed.push(part.name);\n            } else {\n                tmp.push(part.data);\n            }\n        }\n        tmp = tmp.join('');\n        var pipe = tmp.indexOf('|');\n        var subdomain = tmp.substring(0, pipe);\n        var url = tmp.substring(pipe+1);\n\n        var unprocessed = array_diff(args.names, processed);\n        var first_query_var = true;\n        for (var i = 0; i < unprocessed.length; i++) {\n            if (first_query_var) {\n                url += '?';\n            } else {\n                url += '&';\n            }\n            first_query_var = false;\n            url += encodeURIComponent(unprocessed[i]);\n            url += '=';\n            url += encodeURIComponent(args.original[unprocessed[i]]);\n        }\n        return {subdomain: subdomain, path: url};\n    }\n    function lstrip(s, c) {\n        while (s && s.substring(0, 1) == c) {\n            s = s.substring(1);\n        }\n        return s;\n    }\n    function rstrip(s, c) {\n        while (s && s.substring(s.length-1, s.length) == c) {\n            s = s.substring(0, s.length-1);\n        }\n        return s;\n    }\n    return function(endpoint, args, force_external) {\n        args = split_obj(args);\n        var rv = null;\n        for (var i = 0; i < rules.length; i++) {\n            var rule = rules[i];\n            if (rule.endpoint != endpoint) continue;\n            if (suitable(rule, args)) {\n                rv = build(rule, args);\n                if (rv != null) {\n                    break;\n                }\n            }\n        }\n        if (rv == null) {\n            return null;\n        }\n        if (!force_external && rv.subdomain == subdomain) {\n            return rstrip(script_name, '/') + '/' + lstrip(rv.path, '/');\n        } else {\n            return url_scheme + '://'\n                   + (rv.subdomain ? rv.subdomain + '.' : '')\n                   + server_name + rstrip(script_name, '/')\n                   + '/' + lstrip(rv.path, '/');\n        }\n    };\n})\"\"\" % {'converters': u', '.join(converters),\n         'rules': rules}\n\n    return result\n\n\ndef generate_map(map, name='url_map'):\n    \"\"\"\n    Generates a JavaScript function containing the rules defined in\n    this map, to be used with a MapAdapter's generate_javascript\n    method.  If you don't pass a name the returned JavaScript code is\n    an expression that returns a function.  Otherwise it's a standalone\n    script that assigns the function with that name.  Dotted names are\n    resolved (so you an use a name like 'obj.url_for')\n\n    In order to use JavaScript generation, simplejson must be installed.\n\n    Note that using this feature will expose the rules\n    defined in your map to users. If your rules contain sensitive\n    information, don't use JavaScript generation!\n    \"\"\"\n    from warnings import warn\n    warn(DeprecationWarning('This module is deprecated'))\n    map.update()\n    rules = []\n    converters = []\n    for rule in map.iter_rules():\n        trace = [{\n            'is_dynamic':   is_dynamic,\n            'data':         data\n        } for is_dynamic, data in rule._trace]\n        rule_converters = {}\n        for key, converter in iteritems(rule._converters):\n            js_func = js_to_url_function(converter)\n            try:\n                index = converters.index(js_func)\n            except ValueError:\n                converters.append(js_func)\n                index = len(converters) - 1\n            rule_converters[key] = index\n        rules.append({\n            u'endpoint':    rule.endpoint,\n            u'arguments':   list(rule.arguments),\n            u'converters':  rule_converters,\n            u'trace':       trace,\n            u'defaults':    rule.defaults\n        })\n\n    return render_template(name_parts=name and name.split('.') or [],\n                           rules=dumps(rules),\n                           converters=converters)\n\n\ndef generate_adapter(adapter, name='url_for', map_name='url_map'):\n    \"\"\"Generates the url building function for a map.\"\"\"\n    values = {\n        u'server_name':     dumps(adapter.server_name),\n        u'script_name':     dumps(adapter.script_name),\n        u'subdomain':       dumps(adapter.subdomain),\n        u'url_scheme':      dumps(adapter.url_scheme),\n        u'name':            name,\n        u'map_name':        map_name\n    }\n    return u'''\\\nvar %(name)s = %(map_name)s(\n    %(server_name)s,\n    %(script_name)s,\n    %(subdomain)s,\n    %(url_scheme)s\n);''' % values\n\n\ndef js_to_url_function(converter):\n    \"\"\"Get the JavaScript converter function from a rule.\"\"\"\n    if hasattr(converter, 'js_to_url_function'):\n        data = converter.js_to_url_function()\n    else:\n        for cls in getmro(type(converter)):\n            if cls in js_to_url_functions:\n                data = js_to_url_functions[cls](converter)\n                break\n        else:\n            return 'encodeURIComponent'\n    return '(function(value) { %s })' % data\n\n\ndef NumberConverter_js_to_url(conv):\n    if conv.fixed_digits:\n        return u'''\\\nvar result = value.toString();\nwhile (result.length < %s)\n    result = '0' + result;\nreturn result;''' % conv.fixed_digits\n    return u'return value.toString();'\n\n\njs_to_url_functions = {\n    NumberConverter:    NumberConverter_js_to_url\n}\n"
  },
  {
    "path": "lib/werkzeug/contrib/limiter.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    werkzeug.contrib.limiter\n    ~~~~~~~~~~~~~~~~~~~~~~~~\n\n    A middleware that limits incoming data.  This works around problems with\n    Trac_ or Django_ because those directly stream into the memory.\n\n    .. _Trac: http://trac.edgewall.org/\n    .. _Django: http://www.djangoproject.com/\n\n    :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nfrom warnings import warn\n\nfrom werkzeug.wsgi import LimitedStream\n\n\nclass StreamLimitMiddleware(object):\n\n    \"\"\"Limits the input stream to a given number of bytes.  This is useful if\n    you have a WSGI application that reads form data into memory (django for\n    example) and you don't want users to harm the server by uploading tons of\n    data.\n\n    Default is 10MB\n\n    .. versionchanged:: 0.9\n       Deprecated middleware.\n    \"\"\"\n\n    def __init__(self, app, maximum_size=1024 * 1024 * 10):\n        warn(DeprecationWarning('This middleware is deprecated'))\n        self.app = app\n        self.maximum_size = maximum_size\n\n    def __call__(self, environ, start_response):\n        limit = min(self.maximum_size, int(environ.get('CONTENT_LENGTH') or 0))\n        environ['wsgi.input'] = LimitedStream(environ['wsgi.input'], limit)\n        return self.app(environ, start_response)\n"
  },
  {
    "path": "lib/werkzeug/contrib/lint.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    werkzeug.contrib.lint\n    ~~~~~~~~~~~~~~~~~~~~~\n\n    .. versionadded:: 0.5\n\n    This module provides a middleware that performs sanity checks of the WSGI\n    application.  It checks that :pep:`333` is properly implemented and warns\n    on some common HTTP errors such as non-empty responses for 304 status\n    codes.\n\n    This module provides a middleware, the :class:`LintMiddleware`.  Wrap your\n    application with it and it will warn about common problems with WSGI and\n    HTTP while your application is running.\n\n    It's strongly recommended to use it during development.\n\n    :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nfrom urlparse import urlparse\nfrom warnings import warn\n\nfrom werkzeug.datastructures import Headers\nfrom werkzeug.http import is_entity_header\nfrom werkzeug.wsgi import FileWrapper\nfrom werkzeug._compat import string_types\n\n\nclass WSGIWarning(Warning):\n\n    \"\"\"Warning class for WSGI warnings.\"\"\"\n\n\nclass HTTPWarning(Warning):\n\n    \"\"\"Warning class for HTTP warnings.\"\"\"\n\n\ndef check_string(context, obj, stacklevel=3):\n    if type(obj) is not str:\n        warn(WSGIWarning('%s requires bytestrings, got %s' %\n                         (context, obj.__class__.__name__)))\n\n\nclass InputStream(object):\n\n    def __init__(self, stream):\n        self._stream = stream\n\n    def read(self, *args):\n        if len(args) == 0:\n            warn(WSGIWarning('wsgi does not guarantee an EOF marker on the '\n                             'input stream, thus making calls to '\n                             'wsgi.input.read() unsafe.  Conforming servers '\n                             'may never return from this call.'),\n                 stacklevel=2)\n        elif len(args) != 1:\n            warn(WSGIWarning('too many parameters passed to wsgi.input.read()'),\n                 stacklevel=2)\n        return self._stream.read(*args)\n\n    def readline(self, *args):\n        if len(args) == 0:\n            warn(WSGIWarning('Calls to wsgi.input.readline() without arguments'\n                             ' are unsafe.  Use wsgi.input.read() instead.'),\n                 stacklevel=2)\n        elif len(args) == 1:\n            warn(WSGIWarning('wsgi.input.readline() was called with a size hint. '\n                             'WSGI does not support this, although it\\'s available '\n                             'on all major servers.'),\n                 stacklevel=2)\n        else:\n            raise TypeError('too many arguments passed to wsgi.input.readline()')\n        return self._stream.readline(*args)\n\n    def __iter__(self):\n        try:\n            return iter(self._stream)\n        except TypeError:\n            warn(WSGIWarning('wsgi.input is not iterable.'), stacklevel=2)\n            return iter(())\n\n    def close(self):\n        warn(WSGIWarning('application closed the input stream!'),\n             stacklevel=2)\n        self._stream.close()\n\n\nclass ErrorStream(object):\n\n    def __init__(self, stream):\n        self._stream = stream\n\n    def write(self, s):\n        check_string('wsgi.error.write()', s)\n        self._stream.write(s)\n\n    def flush(self):\n        self._stream.flush()\n\n    def writelines(self, seq):\n        for line in seq:\n            self.write(seq)\n\n    def close(self):\n        warn(WSGIWarning('application closed the error stream!'),\n             stacklevel=2)\n        self._stream.close()\n\n\nclass GuardedWrite(object):\n\n    def __init__(self, write, chunks):\n        self._write = write\n        self._chunks = chunks\n\n    def __call__(self, s):\n        check_string('write()', s)\n        self._write.write(s)\n        self._chunks.append(len(s))\n\n\nclass GuardedIterator(object):\n\n    def __init__(self, iterator, headers_set, chunks):\n        self._iterator = iterator\n        self._next = iter(iterator).next\n        self.closed = False\n        self.headers_set = headers_set\n        self.chunks = chunks\n\n    def __iter__(self):\n        return self\n\n    def next(self):\n        if self.closed:\n            warn(WSGIWarning('iterated over closed app_iter'),\n                 stacklevel=2)\n        rv = self._next()\n        if not self.headers_set:\n            warn(WSGIWarning('Application returned before it '\n                             'started the response'), stacklevel=2)\n        check_string('application iterator items', rv)\n        self.chunks.append(len(rv))\n        return rv\n\n    def close(self):\n        self.closed = True\n        if hasattr(self._iterator, 'close'):\n            self._iterator.close()\n\n        if self.headers_set:\n            status_code, headers = self.headers_set\n            bytes_sent = sum(self.chunks)\n            content_length = headers.get('content-length', type=int)\n\n            if status_code == 304:\n                for key, value in headers:\n                    key = key.lower()\n                    if key not in ('expires', 'content-location') and \\\n                       is_entity_header(key):\n                        warn(HTTPWarning('entity header %r found in 304 '\n                                         'response' % key))\n                if bytes_sent:\n                    warn(HTTPWarning('304 responses must not have a body'))\n            elif 100 <= status_code < 200 or status_code == 204:\n                if content_length != 0:\n                    warn(HTTPWarning('%r responses must have an empty '\n                                     'content length') % status_code)\n                if bytes_sent:\n                    warn(HTTPWarning('%r responses must not have a body' %\n                                     status_code))\n            elif content_length is not None and content_length != bytes_sent:\n                warn(WSGIWarning('Content-Length and the number of bytes '\n                                 'sent to the client do not match.'))\n\n    def __del__(self):\n        if not self.closed:\n            try:\n                warn(WSGIWarning('Iterator was garbage collected before '\n                                 'it was closed.'))\n            except Exception:\n                pass\n\n\nclass LintMiddleware(object):\n\n    \"\"\"This middleware wraps an application and warns on common errors.\n    Among other thing it currently checks for the following problems:\n\n    -   invalid status codes\n    -   non-bytestrings sent to the WSGI server\n    -   strings returned from the WSGI application\n    -   non-empty conditional responses\n    -   unquoted etags\n    -   relative URLs in the Location header\n    -   unsafe calls to wsgi.input\n    -   unclosed iterators\n\n    Detected errors are emitted using the standard Python :mod:`warnings`\n    system and usually end up on :data:`stderr`.\n\n    ::\n\n        from werkzeug.contrib.lint import LintMiddleware\n        app = LintMiddleware(app)\n\n    :param app: the application to wrap\n    \"\"\"\n\n    def __init__(self, app):\n        self.app = app\n\n    def check_environ(self, environ):\n        if type(environ) is not dict:\n            warn(WSGIWarning('WSGI environment is not a standard python dict.'),\n                 stacklevel=4)\n        for key in ('REQUEST_METHOD', 'SERVER_NAME', 'SERVER_PORT',\n                    'wsgi.version', 'wsgi.input', 'wsgi.errors',\n                    'wsgi.multithread', 'wsgi.multiprocess',\n                    'wsgi.run_once'):\n            if key not in environ:\n                warn(WSGIWarning('required environment key %r not found'\n                                 % key), stacklevel=3)\n        if environ['wsgi.version'] != (1, 0):\n            warn(WSGIWarning('environ is not a WSGI 1.0 environ'),\n                 stacklevel=3)\n\n        script_name = environ.get('SCRIPT_NAME', '')\n        if script_name and script_name[:1] != '/':\n            warn(WSGIWarning('SCRIPT_NAME does not start with a slash: %r'\n                             % script_name), stacklevel=3)\n        path_info = environ.get('PATH_INFO', '')\n        if path_info[:1] != '/':\n            warn(WSGIWarning('PATH_INFO does not start with a slash: %r'\n                             % path_info), stacklevel=3)\n\n    def check_start_response(self, status, headers, exc_info):\n        check_string('status', status)\n        status_code = status.split(None, 1)[0]\n        if len(status_code) != 3 or not status_code.isdigit():\n            warn(WSGIWarning('Status code must be three digits'), stacklevel=3)\n        if len(status) < 4 or status[3] != ' ':\n            warn(WSGIWarning('Invalid value for status %r.  Valid '\n                             'status strings are three digits, a space '\n                             'and a status explanation'), stacklevel=3)\n        status_code = int(status_code)\n        if status_code < 100:\n            warn(WSGIWarning('status code < 100 detected'), stacklevel=3)\n\n        if type(headers) is not list:\n            warn(WSGIWarning('header list is not a list'), stacklevel=3)\n        for item in headers:\n            if type(item) is not tuple or len(item) != 2:\n                warn(WSGIWarning('Headers must tuple 2-item tuples'),\n                     stacklevel=3)\n            name, value = item\n            if type(name) is not str or type(value) is not str:\n                warn(WSGIWarning('header items must be strings'),\n                     stacklevel=3)\n            if name.lower() == 'status':\n                warn(WSGIWarning('The status header is not supported due to '\n                                 'conflicts with the CGI spec.'),\n                     stacklevel=3)\n\n        if exc_info is not None and not isinstance(exc_info, tuple):\n            warn(WSGIWarning('invalid value for exc_info'), stacklevel=3)\n\n        headers = Headers(headers)\n        self.check_headers(headers)\n\n        return status_code, headers\n\n    def check_headers(self, headers):\n        etag = headers.get('etag')\n        if etag is not None:\n            if etag.startswith('w/'):\n                etag = etag[2:]\n            if not (etag[:1] == etag[-1:] == '\"'):\n                warn(HTTPWarning('unquoted etag emitted.'), stacklevel=4)\n\n        location = headers.get('location')\n        if location is not None:\n            if not urlparse(location).netloc:\n                warn(HTTPWarning('absolute URLs required for location header'),\n                     stacklevel=4)\n\n    def check_iterator(self, app_iter):\n        if isinstance(app_iter, string_types):\n            warn(WSGIWarning('application returned string.  Response will '\n                             'send character for character to the client '\n                             'which will kill the performance.  Return a '\n                             'list or iterable instead.'), stacklevel=3)\n\n    def __call__(self, *args, **kwargs):\n        if len(args) != 2:\n            warn(WSGIWarning('Two arguments to WSGI app required'), stacklevel=2)\n        if kwargs:\n            warn(WSGIWarning('No keyword arguments to WSGI app allowed'),\n                 stacklevel=2)\n        environ, start_response = args\n\n        self.check_environ(environ)\n        environ['wsgi.input'] = InputStream(environ['wsgi.input'])\n        environ['wsgi.errors'] = ErrorStream(environ['wsgi.errors'])\n\n        # hook our own file wrapper in so that applications will always\n        # iterate to the end and we can check the content length\n        environ['wsgi.file_wrapper'] = FileWrapper\n\n        headers_set = []\n        chunks = []\n\n        def checking_start_response(*args, **kwargs):\n            if len(args) not in (2, 3):\n                warn(WSGIWarning('Invalid number of arguments: %s, expected '\n                                 '2 or 3' % len(args), stacklevel=2))\n            if kwargs:\n                warn(WSGIWarning('no keyword arguments allowed.'))\n\n            status, headers = args[:2]\n            if len(args) == 3:\n                exc_info = args[2]\n            else:\n                exc_info = None\n\n            headers_set[:] = self.check_start_response(status, headers,\n                                                       exc_info)\n            return GuardedWrite(start_response(status, headers, exc_info),\n                                chunks)\n\n        app_iter = self.app(environ, checking_start_response)\n        self.check_iterator(app_iter)\n        return GuardedIterator(app_iter, headers_set, chunks)\n"
  },
  {
    "path": "lib/werkzeug/contrib/profiler.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    werkzeug.contrib.profiler\n    ~~~~~~~~~~~~~~~~~~~~~~~~~\n\n    This module provides a simple WSGI profiler middleware for finding\n    bottlenecks in web application.  It uses the :mod:`profile` or\n    :mod:`cProfile` module to do the profiling and writes the stats to the\n    stream provided (defaults to stderr).\n\n    Example usage::\n\n        from werkzeug.contrib.profiler import ProfilerMiddleware\n        app = ProfilerMiddleware(app)\n\n    :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nimport sys\nimport time\nimport os.path\ntry:\n    try:\n        from cProfile import Profile\n    except ImportError:\n        from profile import Profile\n    from pstats import Stats\n    available = True\nexcept ImportError:\n    available = False\n\n\nclass MergeStream(object):\n\n    \"\"\"An object that redirects `write` calls to multiple streams.\n    Use this to log to both `sys.stdout` and a file::\n\n        f = open('profiler.log', 'w')\n        stream = MergeStream(sys.stdout, f)\n        profiler = ProfilerMiddleware(app, stream)\n    \"\"\"\n\n    def __init__(self, *streams):\n        if not streams:\n            raise TypeError('at least one stream must be given')\n        self.streams = streams\n\n    def write(self, data):\n        for stream in self.streams:\n            stream.write(data)\n\n\nclass ProfilerMiddleware(object):\n\n    \"\"\"Simple profiler middleware.  Wraps a WSGI application and profiles\n    a request.  This intentionally buffers the response so that timings are\n    more exact.\n\n    By giving the `profile_dir` argument, pstat.Stats files are saved to that\n    directory, one file per request. Without it, a summary is printed to\n    `stream` instead.\n\n    For the exact meaning of `sort_by` and `restrictions` consult the\n    :mod:`profile` documentation.\n\n    .. versionadded:: 0.9\n       Added support for `restrictions` and `profile_dir`.\n\n    :param app: the WSGI application to profile.\n    :param stream: the stream for the profiled stats.  defaults to stderr.\n    :param sort_by: a tuple of columns to sort the result by.\n    :param restrictions: a tuple of profiling strictions, not used if dumping\n                         to `profile_dir`.\n    :param profile_dir: directory name to save pstat files\n    \"\"\"\n\n    def __init__(self, app, stream=None,\n                 sort_by=('time', 'calls'), restrictions=(), profile_dir=None):\n        if not available:\n            raise RuntimeError('the profiler is not available because '\n                               'profile or pstat is not installed.')\n        self._app = app\n        self._stream = stream or sys.stdout\n        self._sort_by = sort_by\n        self._restrictions = restrictions\n        self._profile_dir = profile_dir\n\n    def __call__(self, environ, start_response):\n        response_body = []\n\n        def catching_start_response(status, headers, exc_info=None):\n            start_response(status, headers, exc_info)\n            return response_body.append\n\n        def runapp():\n            appiter = self._app(environ, catching_start_response)\n            response_body.extend(appiter)\n            if hasattr(appiter, 'close'):\n                appiter.close()\n\n        p = Profile()\n        start = time.time()\n        p.runcall(runapp)\n        body = b''.join(response_body)\n        elapsed = time.time() - start\n\n        if self._profile_dir is not None:\n            prof_filename = os.path.join(self._profile_dir,\n                                         '%s.%s.%06dms.%d.prof' % (\n                                             environ['REQUEST_METHOD'],\n                                             environ.get('PATH_INFO').strip(\n                                                 '/').replace('/', '.') or 'root',\n                                             elapsed * 1000.0,\n                                             time.time()\n                                         ))\n            p.dump_stats(prof_filename)\n\n        else:\n            stats = Stats(p, stream=self._stream)\n            stats.sort_stats(*self._sort_by)\n\n            self._stream.write('-' * 80)\n            self._stream.write('\\nPATH: %r\\n' % environ.get('PATH_INFO'))\n            stats.print_stats(*self._restrictions)\n            self._stream.write('-' * 80 + '\\n\\n')\n\n        return [body]\n\n\ndef make_action(app_factory, hostname='localhost', port=5000,\n                threaded=False, processes=1, stream=None,\n                sort_by=('time', 'calls'), restrictions=()):\n    \"\"\"Return a new callback for :mod:`werkzeug.script` that starts a local\n    server with the profiler enabled.\n\n    ::\n\n        from werkzeug.contrib import profiler\n        action_profile = profiler.make_action(make_app)\n    \"\"\"\n    def action(hostname=('h', hostname), port=('p', port),\n               threaded=threaded, processes=processes):\n        \"\"\"Start a new development server.\"\"\"\n        from werkzeug.serving import run_simple\n        app = ProfilerMiddleware(app_factory(), stream, sort_by, restrictions)\n        run_simple(hostname, port, app, False, None, threaded, processes)\n    return action\n"
  },
  {
    "path": "lib/werkzeug/contrib/securecookie.py",
    "content": "# -*- coding: utf-8 -*-\nr\"\"\"\n    werkzeug.contrib.securecookie\n    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n    This module implements a cookie that is not alterable from the client\n    because it adds a checksum the server checks for.  You can use it as\n    session replacement if all you have is a user id or something to mark\n    a logged in user.\n\n    Keep in mind that the data is still readable from the client as a\n    normal cookie is.  However you don't have to store and flush the\n    sessions you have at the server.\n\n    Example usage:\n\n    >>> from werkzeug.contrib.securecookie import SecureCookie\n    >>> x = SecureCookie({\"foo\": 42, \"baz\": (1, 2, 3)}, \"deadbeef\")\n\n    Dumping into a string so that one can store it in a cookie:\n\n    >>> value = x.serialize()\n\n    Loading from that string again:\n\n    >>> x = SecureCookie.unserialize(value, \"deadbeef\")\n    >>> x[\"baz\"]\n    (1, 2, 3)\n\n    If someone modifies the cookie and the checksum is wrong the unserialize\n    method will fail silently and return a new empty `SecureCookie` object.\n\n    Keep in mind that the values will be visible in the cookie so do not\n    store data in a cookie you don't want the user to see.\n\n    Application Integration\n    =======================\n\n    If you are using the werkzeug request objects you could integrate the\n    secure cookie into your application like this::\n\n        from werkzeug.utils import cached_property\n        from werkzeug.wrappers import BaseRequest\n        from werkzeug.contrib.securecookie import SecureCookie\n\n        # don't use this key but a different one; you could just use\n        # os.urandom(20) to get something random\n        SECRET_KEY = '\\xfa\\xdd\\xb8z\\xae\\xe0}4\\x8b\\xea'\n\n        class Request(BaseRequest):\n\n            @cached_property\n            def client_session(self):\n                data = self.cookies.get('session_data')\n                if not data:\n                    return SecureCookie(secret_key=SECRET_KEY)\n                return SecureCookie.unserialize(data, SECRET_KEY)\n\n        def application(environ, start_response):\n            request = Request(environ, start_response)\n\n            # get a response object here\n            response = ...\n\n            if request.client_session.should_save:\n                session_data = request.client_session.serialize()\n                response.set_cookie('session_data', session_data,\n                                    httponly=True)\n            return response(environ, start_response)\n\n    A less verbose integration can be achieved by using shorthand methods::\n\n        class Request(BaseRequest):\n\n            @cached_property\n            def client_session(self):\n                return SecureCookie.load_cookie(self, secret_key=COOKIE_SECRET)\n\n        def application(environ, start_response):\n            request = Request(environ, start_response)\n\n            # get a response object here\n            response = ...\n\n            request.client_session.save_cookie(response)\n            return response(environ, start_response)\n\n    :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nimport pickle\nimport base64\nfrom hmac import new as hmac\nfrom time import time\nfrom hashlib import sha1 as _default_hash\n\nfrom werkzeug._compat import iteritems, text_type\nfrom werkzeug.urls import url_quote_plus, url_unquote_plus\nfrom werkzeug._internal import _date_to_unix\nfrom werkzeug.contrib.sessions import ModificationTrackingDict\nfrom werkzeug.security import safe_str_cmp\nfrom werkzeug._compat import to_native\n\n\nclass UnquoteError(Exception):\n\n    \"\"\"Internal exception used to signal failures on quoting.\"\"\"\n\n\nclass SecureCookie(ModificationTrackingDict):\n\n    \"\"\"Represents a secure cookie.  You can subclass this class and provide\n    an alternative mac method.  The import thing is that the mac method\n    is a function with a similar interface to the hashlib.  Required\n    methods are update() and digest().\n\n    Example usage:\n\n    >>> x = SecureCookie({\"foo\": 42, \"baz\": (1, 2, 3)}, \"deadbeef\")\n    >>> x[\"foo\"]\n    42\n    >>> x[\"baz\"]\n    (1, 2, 3)\n    >>> x[\"blafasel\"] = 23\n    >>> x.should_save\n    True\n\n    :param data: the initial data.  Either a dict, list of tuples or `None`.\n    :param secret_key: the secret key.  If not set `None` or not specified\n                       it has to be set before :meth:`serialize` is called.\n    :param new: The initial value of the `new` flag.\n    \"\"\"\n\n    #: The hash method to use.  This has to be a module with a new function\n    #: or a function that creates a hashlib object.  Such as `hashlib.md5`\n    #: Subclasses can override this attribute.  The default hash is sha1.\n    #: Make sure to wrap this in staticmethod() if you store an arbitrary\n    #: function there such as hashlib.sha1 which  might be implemented\n    #: as a function.\n    hash_method = staticmethod(_default_hash)\n\n    #: the module used for serialization.  Unless overriden by subclasses\n    #: the standard pickle module is used.\n    serialization_method = pickle\n\n    #: if the contents should be base64 quoted.  This can be disabled if the\n    #: serialization process returns cookie safe strings only.\n    quote_base64 = True\n\n    def __init__(self, data=None, secret_key=None, new=True):\n        ModificationTrackingDict.__init__(self, data or ())\n        # explicitly convert it into a bytestring because python 2.6\n        # no longer performs an implicit string conversion on hmac\n        if secret_key is not None:\n            secret_key = bytes(secret_key)\n        self.secret_key = secret_key\n        self.new = new\n\n    def __repr__(self):\n        return '<%s %s%s>' % (\n            self.__class__.__name__,\n            dict.__repr__(self),\n            self.should_save and '*' or ''\n        )\n\n    @property\n    def should_save(self):\n        \"\"\"True if the session should be saved.  By default this is only true\n        for :attr:`modified` cookies, not :attr:`new`.\n        \"\"\"\n        return self.modified\n\n    @classmethod\n    def quote(cls, value):\n        \"\"\"Quote the value for the cookie.  This can be any object supported\n        by :attr:`serialization_method`.\n\n        :param value: the value to quote.\n        \"\"\"\n        if cls.serialization_method is not None:\n            value = cls.serialization_method.dumps(value)\n        if cls.quote_base64:\n            value = b''.join(base64.b64encode(value).splitlines()).strip()\n        return value\n\n    @classmethod\n    def unquote(cls, value):\n        \"\"\"Unquote the value for the cookie.  If unquoting does not work a\n        :exc:`UnquoteError` is raised.\n\n        :param value: the value to unquote.\n        \"\"\"\n        try:\n            if cls.quote_base64:\n                value = base64.b64decode(value)\n            if cls.serialization_method is not None:\n                value = cls.serialization_method.loads(value)\n            return value\n        except Exception:\n            # unfortunately pickle and other serialization modules can\n            # cause pretty every error here.  if we get one we catch it\n            # and convert it into an UnquoteError\n            raise UnquoteError()\n\n    def serialize(self, expires=None):\n        \"\"\"Serialize the secure cookie into a string.\n\n        If expires is provided, the session will be automatically invalidated\n        after expiration when you unseralize it. This provides better\n        protection against session cookie theft.\n\n        :param expires: an optional expiration date for the cookie (a\n                        :class:`datetime.datetime` object)\n        \"\"\"\n        if self.secret_key is None:\n            raise RuntimeError('no secret key defined')\n        if expires:\n            self['_expires'] = _date_to_unix(expires)\n        result = []\n        mac = hmac(self.secret_key, None, self.hash_method)\n        for key, value in sorted(self.items()):\n            result.append(('%s=%s' % (\n                url_quote_plus(key),\n                self.quote(value).decode('ascii')\n            )).encode('ascii'))\n            mac.update(b'|' + result[-1])\n        return b'?'.join([\n            base64.b64encode(mac.digest()).strip(),\n            b'&'.join(result)\n        ])\n\n    @classmethod\n    def unserialize(cls, string, secret_key):\n        \"\"\"Load the secure cookie from a serialized string.\n\n        :param string: the cookie value to unserialize.\n        :param secret_key: the secret key used to serialize the cookie.\n        :return: a new :class:`SecureCookie`.\n        \"\"\"\n        if isinstance(string, text_type):\n            string = string.encode('utf-8', 'replace')\n        if isinstance(secret_key, text_type):\n            secret_key = secret_key.encode('utf-8', 'replace')\n        try:\n            base64_hash, data = string.split(b'?', 1)\n        except (ValueError, IndexError):\n            items = ()\n        else:\n            items = {}\n            mac = hmac(secret_key, None, cls.hash_method)\n            for item in data.split(b'&'):\n                mac.update(b'|' + item)\n                if b'=' not in item:\n                    items = None\n                    break\n                key, value = item.split(b'=', 1)\n                # try to make the key a string\n                key = url_unquote_plus(key.decode('ascii'))\n                try:\n                    key = to_native(key)\n                except UnicodeError:\n                    pass\n                items[key] = value\n\n            # no parsing error and the mac looks okay, we can now\n            # sercurely unpickle our cookie.\n            try:\n                client_hash = base64.b64decode(base64_hash)\n            except TypeError:\n                items = client_hash = None\n            if items is not None and safe_str_cmp(client_hash, mac.digest()):\n                try:\n                    for key, value in iteritems(items):\n                        items[key] = cls.unquote(value)\n                except UnquoteError:\n                    items = ()\n                else:\n                    if '_expires' in items:\n                        if time() > items['_expires']:\n                            items = ()\n                        else:\n                            del items['_expires']\n            else:\n                items = ()\n        return cls(items, secret_key, False)\n\n    @classmethod\n    def load_cookie(cls, request, key='session', secret_key=None):\n        \"\"\"Loads a :class:`SecureCookie` from a cookie in request.  If the\n        cookie is not set, a new :class:`SecureCookie` instanced is\n        returned.\n\n        :param request: a request object that has a `cookies` attribute\n                        which is a dict of all cookie values.\n        :param key: the name of the cookie.\n        :param secret_key: the secret key used to unquote the cookie.\n                           Always provide the value even though it has\n                           no default!\n        \"\"\"\n        data = request.cookies.get(key)\n        if not data:\n            return cls(secret_key=secret_key)\n        return cls.unserialize(data, secret_key)\n\n    def save_cookie(self, response, key='session', expires=None,\n                    session_expires=None, max_age=None, path='/', domain=None,\n                    secure=None, httponly=False, force=False):\n        \"\"\"Saves the SecureCookie in a cookie on response object.  All\n        parameters that are not described here are forwarded directly\n        to :meth:`~BaseResponse.set_cookie`.\n\n        :param response: a response object that has a\n                         :meth:`~BaseResponse.set_cookie` method.\n        :param key: the name of the cookie.\n        :param session_expires: the expiration date of the secure cookie\n                                stored information.  If this is not provided\n                                the cookie `expires` date is used instead.\n        \"\"\"\n        if force or self.should_save:\n            data = self.serialize(session_expires or expires)\n            response.set_cookie(key, data, expires=expires, max_age=max_age,\n                                path=path, domain=domain, secure=secure,\n                                httponly=httponly)\n"
  },
  {
    "path": "lib/werkzeug/contrib/sessions.py",
    "content": "# -*- coding: utf-8 -*-\nr\"\"\"\n    werkzeug.contrib.sessions\n    ~~~~~~~~~~~~~~~~~~~~~~~~~\n\n    This module contains some helper classes that help one to add session\n    support to a python WSGI application.  For full client-side session\n    storage see :mod:`~werkzeug.contrib.securecookie` which implements a\n    secure, client-side session storage.\n\n\n    Application Integration\n    =======================\n\n    ::\n\n        from werkzeug.contrib.sessions import SessionMiddleware, \\\n             FilesystemSessionStore\n\n        app = SessionMiddleware(app, FilesystemSessionStore())\n\n    The current session will then appear in the WSGI environment as\n    `werkzeug.session`.  However it's recommended to not use the middleware\n    but the stores directly in the application.  However for very simple\n    scripts a middleware for sessions could be sufficient.\n\n    This module does not implement methods or ways to check if a session is\n    expired.  That should be done by a cronjob and storage specific.  For\n    example to prune unused filesystem sessions one could check the modified\n    time of the files.  It sessions are stored in the database the new()\n    method should add an expiration timestamp for the session.\n\n    For better flexibility it's recommended to not use the middleware but the\n    store and session object directly in the application dispatching::\n\n        session_store = FilesystemSessionStore()\n\n        def application(environ, start_response):\n            request = Request(environ)\n            sid = request.cookies.get('cookie_name')\n            if sid is None:\n                request.session = session_store.new()\n            else:\n                request.session = session_store.get(sid)\n            response = get_the_response_object(request)\n            if request.session.should_save:\n                session_store.save(request.session)\n                response.set_cookie('cookie_name', request.session.sid)\n            return response(environ, start_response)\n\n    :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nimport re\nimport os\nimport tempfile\nfrom os import path\nfrom time import time\nfrom random import random\nfrom hashlib import sha1\nfrom pickle import dump, load, HIGHEST_PROTOCOL\n\nfrom werkzeug.datastructures import CallbackDict\nfrom werkzeug.utils import dump_cookie, parse_cookie\nfrom werkzeug.wsgi import ClosingIterator\nfrom werkzeug.posixemulation import rename\nfrom werkzeug._compat import PY2, text_type\nfrom werkzeug.filesystem import get_filesystem_encoding\n\n\n_sha1_re = re.compile(r'^[a-f0-9]{40}$')\n\n\ndef _urandom():\n    if hasattr(os, 'urandom'):\n        return os.urandom(30)\n    return text_type(random()).encode('ascii')\n\n\ndef generate_key(salt=None):\n    if salt is None:\n        salt = repr(salt).encode('ascii')\n    return sha1(b''.join([\n        salt,\n        str(time()).encode('ascii'),\n        _urandom()\n    ])).hexdigest()\n\n\nclass ModificationTrackingDict(CallbackDict):\n    __slots__ = ('modified',)\n\n    def __init__(self, *args, **kwargs):\n        def on_update(self):\n            self.modified = True\n        self.modified = False\n        CallbackDict.__init__(self, on_update=on_update)\n        dict.update(self, *args, **kwargs)\n\n    def copy(self):\n        \"\"\"Create a flat copy of the dict.\"\"\"\n        missing = object()\n        result = object.__new__(self.__class__)\n        for name in self.__slots__:\n            val = getattr(self, name, missing)\n            if val is not missing:\n                setattr(result, name, val)\n        return result\n\n    def __copy__(self):\n        return self.copy()\n\n\nclass Session(ModificationTrackingDict):\n\n    \"\"\"Subclass of a dict that keeps track of direct object changes.  Changes\n    in mutable structures are not tracked, for those you have to set\n    `modified` to `True` by hand.\n    \"\"\"\n    __slots__ = ModificationTrackingDict.__slots__ + ('sid', 'new')\n\n    def __init__(self, data, sid, new=False):\n        ModificationTrackingDict.__init__(self, data)\n        self.sid = sid\n        self.new = new\n\n    def __repr__(self):\n        return '<%s %s%s>' % (\n            self.__class__.__name__,\n            dict.__repr__(self),\n            self.should_save and '*' or ''\n        )\n\n    @property\n    def should_save(self):\n        \"\"\"True if the session should be saved.\n\n        .. versionchanged:: 0.6\n           By default the session is now only saved if the session is\n           modified, not if it is new like it was before.\n        \"\"\"\n        return self.modified\n\n\nclass SessionStore(object):\n\n    \"\"\"Baseclass for all session stores.  The Werkzeug contrib module does not\n    implement any useful stores besides the filesystem store, application\n    developers are encouraged to create their own stores.\n\n    :param session_class: The session class to use.  Defaults to\n                          :class:`Session`.\n    \"\"\"\n\n    def __init__(self, session_class=None):\n        if session_class is None:\n            session_class = Session\n        self.session_class = session_class\n\n    def is_valid_key(self, key):\n        \"\"\"Check if a key has the correct format.\"\"\"\n        return _sha1_re.match(key) is not None\n\n    def generate_key(self, salt=None):\n        \"\"\"Simple function that generates a new session key.\"\"\"\n        return generate_key(salt)\n\n    def new(self):\n        \"\"\"Generate a new session.\"\"\"\n        return self.session_class({}, self.generate_key(), True)\n\n    def save(self, session):\n        \"\"\"Save a session.\"\"\"\n\n    def save_if_modified(self, session):\n        \"\"\"Save if a session class wants an update.\"\"\"\n        if session.should_save:\n            self.save(session)\n\n    def delete(self, session):\n        \"\"\"Delete a session.\"\"\"\n\n    def get(self, sid):\n        \"\"\"Get a session for this sid or a new session object.  This method\n        has to check if the session key is valid and create a new session if\n        that wasn't the case.\n        \"\"\"\n        return self.session_class({}, sid, True)\n\n\n#: used for temporary files by the filesystem session store\n_fs_transaction_suffix = '.__wz_sess'\n\n\nclass FilesystemSessionStore(SessionStore):\n\n    \"\"\"Simple example session store that saves sessions on the filesystem.\n    This store works best on POSIX systems and Windows Vista / Windows\n    Server 2008 and newer.\n\n    .. versionchanged:: 0.6\n       `renew_missing` was added.  Previously this was considered `True`,\n       now the default changed to `False` and it can be explicitly\n       deactivated.\n\n    :param path: the path to the folder used for storing the sessions.\n                 If not provided the default temporary directory is used.\n    :param filename_template: a string template used to give the session\n                              a filename.  ``%s`` is replaced with the\n                              session id.\n    :param session_class: The session class to use.  Defaults to\n                          :class:`Session`.\n    :param renew_missing: set to `True` if you want the store to\n                          give the user a new sid if the session was\n                          not yet saved.\n    \"\"\"\n\n    def __init__(self, path=None, filename_template='werkzeug_%s.sess',\n                 session_class=None, renew_missing=False, mode=0o644):\n        SessionStore.__init__(self, session_class)\n        if path is None:\n            path = tempfile.gettempdir()\n        self.path = path\n        if isinstance(filename_template, text_type) and PY2:\n            filename_template = filename_template.encode(\n                get_filesystem_encoding())\n        assert not filename_template.endswith(_fs_transaction_suffix), \\\n            'filename templates may not end with %s' % _fs_transaction_suffix\n        self.filename_template = filename_template\n        self.renew_missing = renew_missing\n        self.mode = mode\n\n    def get_session_filename(self, sid):\n        # out of the box, this should be a strict ASCII subset but\n        # you might reconfigure the session object to have a more\n        # arbitrary string.\n        if isinstance(sid, text_type) and PY2:\n            sid = sid.encode(get_filesystem_encoding())\n        return path.join(self.path, self.filename_template % sid)\n\n    def save(self, session):\n        fn = self.get_session_filename(session.sid)\n        fd, tmp = tempfile.mkstemp(suffix=_fs_transaction_suffix,\n                                   dir=self.path)\n        f = os.fdopen(fd, 'wb')\n        try:\n            dump(dict(session), f, HIGHEST_PROTOCOL)\n        finally:\n            f.close()\n        try:\n            rename(tmp, fn)\n            os.chmod(fn, self.mode)\n        except (IOError, OSError):\n            pass\n\n    def delete(self, session):\n        fn = self.get_session_filename(session.sid)\n        try:\n            os.unlink(fn)\n        except OSError:\n            pass\n\n    def get(self, sid):\n        if not self.is_valid_key(sid):\n            return self.new()\n        try:\n            f = open(self.get_session_filename(sid), 'rb')\n        except IOError:\n            if self.renew_missing:\n                return self.new()\n            data = {}\n        else:\n            try:\n                try:\n                    data = load(f)\n                except Exception:\n                    data = {}\n            finally:\n                f.close()\n        return self.session_class(data, sid, False)\n\n    def list(self):\n        \"\"\"Lists all sessions in the store.\n\n        .. versionadded:: 0.6\n        \"\"\"\n        before, after = self.filename_template.split('%s', 1)\n        filename_re = re.compile(r'%s(.{5,})%s$' % (re.escape(before),\n                                                    re.escape(after)))\n        result = []\n        for filename in os.listdir(self.path):\n            #: this is a session that is still being saved.\n            if filename.endswith(_fs_transaction_suffix):\n                continue\n            match = filename_re.match(filename)\n            if match is not None:\n                result.append(match.group(1))\n        return result\n\n\nclass SessionMiddleware(object):\n\n    \"\"\"A simple middleware that puts the session object of a store provided\n    into the WSGI environ.  It automatically sets cookies and restores\n    sessions.\n\n    However a middleware is not the preferred solution because it won't be as\n    fast as sessions managed by the application itself and will put a key into\n    the WSGI environment only relevant for the application which is against\n    the concept of WSGI.\n\n    The cookie parameters are the same as for the :func:`~dump_cookie`\n    function just prefixed with ``cookie_``.  Additionally `max_age` is\n    called `cookie_age` and not `cookie_max_age` because of backwards\n    compatibility.\n    \"\"\"\n\n    def __init__(self, app, store, cookie_name='session_id',\n                 cookie_age=None, cookie_expires=None, cookie_path='/',\n                 cookie_domain=None, cookie_secure=None,\n                 cookie_httponly=False, environ_key='werkzeug.session'):\n        self.app = app\n        self.store = store\n        self.cookie_name = cookie_name\n        self.cookie_age = cookie_age\n        self.cookie_expires = cookie_expires\n        self.cookie_path = cookie_path\n        self.cookie_domain = cookie_domain\n        self.cookie_secure = cookie_secure\n        self.cookie_httponly = cookie_httponly\n        self.environ_key = environ_key\n\n    def __call__(self, environ, start_response):\n        cookie = parse_cookie(environ.get('HTTP_COOKIE', ''))\n        sid = cookie.get(self.cookie_name, None)\n        if sid is None:\n            session = self.store.new()\n        else:\n            session = self.store.get(sid)\n        environ[self.environ_key] = session\n\n        def injecting_start_response(status, headers, exc_info=None):\n            if session.should_save:\n                self.store.save(session)\n                headers.append(('Set-Cookie', dump_cookie(self.cookie_name,\n                                                          session.sid, self.cookie_age,\n                                                          self.cookie_expires, self.cookie_path,\n                                                          self.cookie_domain, self.cookie_secure,\n                                                          self.cookie_httponly)))\n            return start_response(status, headers, exc_info)\n        return ClosingIterator(self.app(environ, injecting_start_response),\n                               lambda: self.store.save_if_modified(session))\n"
  },
  {
    "path": "lib/werkzeug/contrib/testtools.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    werkzeug.contrib.testtools\n    ~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n    This module implements extended wrappers for simplified testing.\n\n    `TestResponse`\n        A response wrapper which adds various cached attributes for\n        simplified assertions on various content types.\n\n    :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nfrom werkzeug.utils import cached_property, import_string\nfrom werkzeug.wrappers import Response\n\nfrom warnings import warn\nwarn(DeprecationWarning('werkzeug.contrib.testtools is deprecated and '\n                        'will be removed with Werkzeug 1.0'))\n\n\nclass ContentAccessors(object):\n\n    \"\"\"\n    A mixin class for response objects that provides a couple of useful\n    accessors for unittesting.\n    \"\"\"\n\n    def xml(self):\n        \"\"\"Get an etree if possible.\"\"\"\n        if 'xml' not in self.mimetype:\n            raise AttributeError(\n                'Not a XML response (Content-Type: %s)'\n                % self.mimetype)\n        for module in ['xml.etree.ElementTree', 'ElementTree',\n                       'elementtree.ElementTree']:\n            etree = import_string(module, silent=True)\n            if etree is not None:\n                return etree.XML(self.body)\n        raise RuntimeError('You must have ElementTree installed '\n                           'to use TestResponse.xml')\n    xml = cached_property(xml)\n\n    def lxml(self):\n        \"\"\"Get an lxml etree if possible.\"\"\"\n        if ('html' not in self.mimetype and 'xml' not in self.mimetype):\n            raise AttributeError('Not an HTML/XML response')\n        from lxml import etree\n        try:\n            from lxml.html import fromstring\n        except ImportError:\n            fromstring = etree.HTML\n        if self.mimetype == 'text/html':\n            return fromstring(self.data)\n        return etree.XML(self.data)\n    lxml = cached_property(lxml)\n\n    def json(self):\n        \"\"\"Get the result of simplejson.loads if possible.\"\"\"\n        if 'json' not in self.mimetype:\n            raise AttributeError('Not a JSON response')\n        try:\n            from simplejson import loads\n        except ImportError:\n            from json import loads\n        return loads(self.data)\n    json = cached_property(json)\n\n\nclass TestResponse(Response, ContentAccessors):\n\n    \"\"\"Pass this to `werkzeug.test.Client` for easier unittesting.\"\"\"\n"
  },
  {
    "path": "lib/werkzeug/contrib/wrappers.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    werkzeug.contrib.wrappers\n    ~~~~~~~~~~~~~~~~~~~~~~~~~\n\n    Extra wrappers or mixins contributed by the community.  These wrappers can\n    be mixed in into request objects to add extra functionality.\n\n    Example::\n\n        from werkzeug.wrappers import Request as RequestBase\n        from werkzeug.contrib.wrappers import JSONRequestMixin\n\n        class Request(RequestBase, JSONRequestMixin):\n            pass\n\n    Afterwards this request object provides the extra functionality of the\n    :class:`JSONRequestMixin`.\n\n    :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nimport codecs\ntry:\n    from simplejson import loads\nexcept ImportError:\n    from json import loads\n\nfrom werkzeug.exceptions import BadRequest\nfrom werkzeug.utils import cached_property\nfrom werkzeug.http import dump_options_header, parse_options_header\nfrom werkzeug._compat import wsgi_decoding_dance\n\n\ndef is_known_charset(charset):\n    \"\"\"Checks if the given charset is known to Python.\"\"\"\n    try:\n        codecs.lookup(charset)\n    except LookupError:\n        return False\n    return True\n\n\nclass JSONRequestMixin(object):\n\n    \"\"\"Add json method to a request object.  This will parse the input data\n    through simplejson if possible.\n\n    :exc:`~werkzeug.exceptions.BadRequest` will be raised if the content-type\n    is not json or if the data itself cannot be parsed as json.\n    \"\"\"\n\n    @cached_property\n    def json(self):\n        \"\"\"Get the result of simplejson.loads if possible.\"\"\"\n        if 'json' not in self.environ.get('CONTENT_TYPE', ''):\n            raise BadRequest('Not a JSON request')\n        try:\n            return loads(self.data)\n        except Exception:\n            raise BadRequest('Unable to read JSON request')\n\n\nclass ProtobufRequestMixin(object):\n\n    \"\"\"Add protobuf parsing method to a request object.  This will parse the\n    input data through `protobuf`_ if possible.\n\n    :exc:`~werkzeug.exceptions.BadRequest` will be raised if the content-type\n    is not protobuf or if the data itself cannot be parsed property.\n\n    .. _protobuf: http://code.google.com/p/protobuf/\n    \"\"\"\n\n    #: by default the :class:`ProtobufRequestMixin` will raise a\n    #: :exc:`~werkzeug.exceptions.BadRequest` if the object is not\n    #: initialized.  You can bypass that check by setting this\n    #: attribute to `False`.\n    protobuf_check_initialization = True\n\n    def parse_protobuf(self, proto_type):\n        \"\"\"Parse the data into an instance of proto_type.\"\"\"\n        if 'protobuf' not in self.environ.get('CONTENT_TYPE', ''):\n            raise BadRequest('Not a Protobuf request')\n\n        obj = proto_type()\n        try:\n            obj.ParseFromString(self.data)\n        except Exception:\n            raise BadRequest(\"Unable to parse Protobuf request\")\n\n        # Fail if not all required fields are set\n        if self.protobuf_check_initialization and not obj.IsInitialized():\n            raise BadRequest(\"Partial Protobuf request\")\n\n        return obj\n\n\nclass RoutingArgsRequestMixin(object):\n\n    \"\"\"This request mixin adds support for the wsgiorg routing args\n    `specification`_.\n\n    .. _specification: http://www.wsgi.org/wsgi/Specifications/routing_args\n    \"\"\"\n\n    def _get_routing_args(self):\n        return self.environ.get('wsgiorg.routing_args', (()))[0]\n\n    def _set_routing_args(self, value):\n        if self.shallow:\n            raise RuntimeError('A shallow request tried to modify the WSGI '\n                               'environment.  If you really want to do that, '\n                               'set `shallow` to False.')\n        self.environ['wsgiorg.routing_args'] = (value, self.routing_vars)\n\n    routing_args = property(_get_routing_args, _set_routing_args, doc='''\n        The positional URL arguments as `tuple`.''')\n    del _get_routing_args, _set_routing_args\n\n    def _get_routing_vars(self):\n        rv = self.environ.get('wsgiorg.routing_args')\n        if rv is not None:\n            return rv[1]\n        rv = {}\n        if not self.shallow:\n            self.routing_vars = rv\n        return rv\n\n    def _set_routing_vars(self, value):\n        if self.shallow:\n            raise RuntimeError('A shallow request tried to modify the WSGI '\n                               'environment.  If you really want to do that, '\n                               'set `shallow` to False.')\n        self.environ['wsgiorg.routing_args'] = (self.routing_args, value)\n\n    routing_vars = property(_get_routing_vars, _set_routing_vars, doc='''\n        The keyword URL arguments as `dict`.''')\n    del _get_routing_vars, _set_routing_vars\n\n\nclass ReverseSlashBehaviorRequestMixin(object):\n\n    \"\"\"This mixin reverses the trailing slash behavior of :attr:`script_root`\n    and :attr:`path`.  This makes it possible to use :func:`~urlparse.urljoin`\n    directly on the paths.\n\n    Because it changes the behavior or :class:`Request` this class has to be\n    mixed in *before* the actual request class::\n\n        class MyRequest(ReverseSlashBehaviorRequestMixin, Request):\n            pass\n\n    This example shows the differences (for an application mounted on\n    `/application` and the request going to `/application/foo/bar`):\n\n        +---------------+-------------------+---------------------+\n        |               | normal behavior   | reverse behavior    |\n        +===============+===================+=====================+\n        | `script_root` | ``/application``  | ``/application/``   |\n        +---------------+-------------------+---------------------+\n        | `path`        | ``/foo/bar``      | ``foo/bar``         |\n        +---------------+-------------------+---------------------+\n    \"\"\"\n\n    @cached_property\n    def path(self):\n        \"\"\"Requested path as unicode.  This works a bit like the regular path\n        info in the WSGI environment but will not include a leading slash.\n        \"\"\"\n        path = wsgi_decoding_dance(self.environ.get('PATH_INFO') or '',\n                                   self.charset, self.encoding_errors)\n        return path.lstrip('/')\n\n    @cached_property\n    def script_root(self):\n        \"\"\"The root path of the script includling a trailing slash.\"\"\"\n        path = wsgi_decoding_dance(self.environ.get('SCRIPT_NAME') or '',\n                                   self.charset, self.encoding_errors)\n        return path.rstrip('/') + '/'\n\n\nclass DynamicCharsetRequestMixin(object):\n\n    \"\"\"\"If this mixin is mixed into a request class it will provide\n    a dynamic `charset` attribute.  This means that if the charset is\n    transmitted in the content type headers it's used from there.\n\n    Because it changes the behavior or :class:`Request` this class has\n    to be mixed in *before* the actual request class::\n\n        class MyRequest(DynamicCharsetRequestMixin, Request):\n            pass\n\n    By default the request object assumes that the URL charset is the\n    same as the data charset.  If the charset varies on each request\n    based on the transmitted data it's not a good idea to let the URLs\n    change based on that.  Most browsers assume either utf-8 or latin1\n    for the URLs if they have troubles figuring out.  It's strongly\n    recommended to set the URL charset to utf-8::\n\n        class MyRequest(DynamicCharsetRequestMixin, Request):\n            url_charset = 'utf-8'\n\n    .. versionadded:: 0.6\n    \"\"\"\n\n    #: the default charset that is assumed if the content type header\n    #: is missing or does not contain a charset parameter.  The default\n    #: is latin1 which is what HTTP specifies as default charset.\n    #: You may however want to set this to utf-8 to better support\n    #: browsers that do not transmit a charset for incoming data.\n    default_charset = 'latin1'\n\n    def unknown_charset(self, charset):\n        \"\"\"Called if a charset was provided but is not supported by\n        the Python codecs module.  By default latin1 is assumed then\n        to not lose any information, you may override this method to\n        change the behavior.\n\n        :param charset: the charset that was not found.\n        :return: the replacement charset.\n        \"\"\"\n        return 'latin1'\n\n    @cached_property\n    def charset(self):\n        \"\"\"The charset from the content type.\"\"\"\n        header = self.environ.get('CONTENT_TYPE')\n        if header:\n            ct, options = parse_options_header(header)\n            charset = options.get('charset')\n            if charset:\n                if is_known_charset(charset):\n                    return charset\n                return self.unknown_charset(charset)\n        return self.default_charset\n\n\nclass DynamicCharsetResponseMixin(object):\n\n    \"\"\"If this mixin is mixed into a response class it will provide\n    a dynamic `charset` attribute.  This means that if the charset is\n    looked up and stored in the `Content-Type` header and updates\n    itself automatically.  This also means a small performance hit but\n    can be useful if you're working with different charsets on\n    responses.\n\n    Because the charset attribute is no a property at class-level, the\n    default value is stored in `default_charset`.\n\n    Because it changes the behavior or :class:`Response` this class has\n    to be mixed in *before* the actual response class::\n\n        class MyResponse(DynamicCharsetResponseMixin, Response):\n            pass\n\n    .. versionadded:: 0.6\n    \"\"\"\n\n    #: the default charset.\n    default_charset = 'utf-8'\n\n    def _get_charset(self):\n        header = self.headers.get('content-type')\n        if header:\n            charset = parse_options_header(header)[1].get('charset')\n            if charset:\n                return charset\n        return self.default_charset\n\n    def _set_charset(self, charset):\n        header = self.headers.get('content-type')\n        ct, options = parse_options_header(header)\n        if not ct:\n            raise TypeError('Cannot set charset if Content-Type '\n                            'header is missing.')\n        options['charset'] = charset\n        self.headers['Content-Type'] = dump_options_header(ct, options)\n\n    charset = property(_get_charset, _set_charset, doc=\"\"\"\n        The charset for the response.  It's stored inside the\n        Content-Type header as a parameter.\"\"\")\n    del _get_charset, _set_charset\n"
  },
  {
    "path": "lib/werkzeug/datastructures.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    werkzeug.datastructures\n    ~~~~~~~~~~~~~~~~~~~~~~~\n\n    This module provides mixins and classes with an immutable interface.\n\n    :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nimport re\nimport codecs\nimport mimetypes\nfrom copy import deepcopy\nfrom itertools import repeat\n\nfrom werkzeug._internal import _missing, _empty_stream\nfrom werkzeug._compat import iterkeys, itervalues, iteritems, iterlists, \\\n    PY2, text_type, integer_types, string_types, make_literal_wrapper, \\\n    to_native\nfrom werkzeug.filesystem import get_filesystem_encoding\n\n\n_locale_delim_re = re.compile(r'[_-]')\n\n\ndef is_immutable(self):\n    raise TypeError('%r objects are immutable' % self.__class__.__name__)\n\n\ndef iter_multi_items(mapping):\n    \"\"\"Iterates over the items of a mapping yielding keys and values\n    without dropping any from more complex structures.\n    \"\"\"\n    if isinstance(mapping, MultiDict):\n        for item in iteritems(mapping, multi=True):\n            yield item\n    elif isinstance(mapping, dict):\n        for key, value in iteritems(mapping):\n            if isinstance(value, (tuple, list)):\n                for value in value:\n                    yield key, value\n            else:\n                yield key, value\n    else:\n        for item in mapping:\n            yield item\n\n\ndef native_itermethods(names):\n    if not PY2:\n        return lambda x: x\n\n    def setmethod(cls, name):\n        itermethod = getattr(cls, name)\n        setattr(cls, 'iter%s' % name, itermethod)\n        listmethod = lambda self, *a, **kw: list(itermethod(self, *a, **kw))\n        listmethod.__doc__ = \\\n            'Like :py:meth:`iter%s`, but returns a list.' % name\n        setattr(cls, name, listmethod)\n\n    def wrap(cls):\n        for name in names:\n            setmethod(cls, name)\n        return cls\n    return wrap\n\n\nclass ImmutableListMixin(object):\n\n    \"\"\"Makes a :class:`list` immutable.\n\n    .. versionadded:: 0.5\n\n    :private:\n    \"\"\"\n\n    _hash_cache = None\n\n    def __hash__(self):\n        if self._hash_cache is not None:\n            return self._hash_cache\n        rv = self._hash_cache = hash(tuple(self))\n        return rv\n\n    def __reduce_ex__(self, protocol):\n        return type(self), (list(self),)\n\n    def __delitem__(self, key):\n        is_immutable(self)\n\n    def __delslice__(self, i, j):\n        is_immutable(self)\n\n    def __iadd__(self, other):\n        is_immutable(self)\n    __imul__ = __iadd__\n\n    def __setitem__(self, key, value):\n        is_immutable(self)\n\n    def __setslice__(self, i, j, value):\n        is_immutable(self)\n\n    def append(self, item):\n        is_immutable(self)\n    remove = append\n\n    def extend(self, iterable):\n        is_immutable(self)\n\n    def insert(self, pos, value):\n        is_immutable(self)\n\n    def pop(self, index=-1):\n        is_immutable(self)\n\n    def reverse(self):\n        is_immutable(self)\n\n    def sort(self, cmp=None, key=None, reverse=None):\n        is_immutable(self)\n\n\nclass ImmutableList(ImmutableListMixin, list):\n\n    \"\"\"An immutable :class:`list`.\n\n    .. versionadded:: 0.5\n\n    :private:\n    \"\"\"\n\n    def __repr__(self):\n        return '%s(%s)' % (\n            self.__class__.__name__,\n            list.__repr__(self),\n        )\n\n\nclass ImmutableDictMixin(object):\n\n    \"\"\"Makes a :class:`dict` immutable.\n\n    .. versionadded:: 0.5\n\n    :private:\n    \"\"\"\n    _hash_cache = None\n\n    @classmethod\n    def fromkeys(cls, keys, value=None):\n        instance = super(cls, cls).__new__(cls)\n        instance.__init__(zip(keys, repeat(value)))\n        return instance\n\n    def __reduce_ex__(self, protocol):\n        return type(self), (dict(self),)\n\n    def _iter_hashitems(self):\n        return iteritems(self)\n\n    def __hash__(self):\n        if self._hash_cache is not None:\n            return self._hash_cache\n        rv = self._hash_cache = hash(frozenset(self._iter_hashitems()))\n        return rv\n\n    def setdefault(self, key, default=None):\n        is_immutable(self)\n\n    def update(self, *args, **kwargs):\n        is_immutable(self)\n\n    def pop(self, key, default=None):\n        is_immutable(self)\n\n    def popitem(self):\n        is_immutable(self)\n\n    def __setitem__(self, key, value):\n        is_immutable(self)\n\n    def __delitem__(self, key):\n        is_immutable(self)\n\n    def clear(self):\n        is_immutable(self)\n\n\nclass ImmutableMultiDictMixin(ImmutableDictMixin):\n\n    \"\"\"Makes a :class:`MultiDict` immutable.\n\n    .. versionadded:: 0.5\n\n    :private:\n    \"\"\"\n\n    def __reduce_ex__(self, protocol):\n        return type(self), (list(iteritems(self, multi=True)),)\n\n    def _iter_hashitems(self):\n        return iteritems(self, multi=True)\n\n    def add(self, key, value):\n        is_immutable(self)\n\n    def popitemlist(self):\n        is_immutable(self)\n\n    def poplist(self, key):\n        is_immutable(self)\n\n    def setlist(self, key, new_list):\n        is_immutable(self)\n\n    def setlistdefault(self, key, default_list=None):\n        is_immutable(self)\n\n\nclass UpdateDictMixin(object):\n\n    \"\"\"Makes dicts call `self.on_update` on modifications.\n\n    .. versionadded:: 0.5\n\n    :private:\n    \"\"\"\n\n    on_update = None\n\n    def calls_update(name):\n        def oncall(self, *args, **kw):\n            rv = getattr(super(UpdateDictMixin, self), name)(*args, **kw)\n            if self.on_update is not None:\n                self.on_update(self)\n            return rv\n        oncall.__name__ = name\n        return oncall\n\n    def setdefault(self, key, default=None):\n        modified = key not in self\n        rv = super(UpdateDictMixin, self).setdefault(key, default)\n        if modified and self.on_update is not None:\n            self.on_update(self)\n        return rv\n\n    def pop(self, key, default=_missing):\n        modified = key in self\n        if default is _missing:\n            rv = super(UpdateDictMixin, self).pop(key)\n        else:\n            rv = super(UpdateDictMixin, self).pop(key, default)\n        if modified and self.on_update is not None:\n            self.on_update(self)\n        return rv\n\n    __setitem__ = calls_update('__setitem__')\n    __delitem__ = calls_update('__delitem__')\n    clear = calls_update('clear')\n    popitem = calls_update('popitem')\n    update = calls_update('update')\n    del calls_update\n\n\nclass TypeConversionDict(dict):\n\n    \"\"\"Works like a regular dict but the :meth:`get` method can perform\n    type conversions.  :class:`MultiDict` and :class:`CombinedMultiDict`\n    are subclasses of this class and provide the same feature.\n\n    .. versionadded:: 0.5\n    \"\"\"\n\n    def get(self, key, default=None, type=None):\n        \"\"\"Return the default value if the requested data doesn't exist.\n        If `type` is provided and is a callable it should convert the value,\n        return it or raise a :exc:`ValueError` if that is not possible.  In\n        this case the function will return the default as if the value was not\n        found:\n\n        >>> d = TypeConversionDict(foo='42', bar='blub')\n        >>> d.get('foo', type=int)\n        42\n        >>> d.get('bar', -1, type=int)\n        -1\n\n        :param key: The key to be looked up.\n        :param default: The default value to be returned if the key can't\n                        be looked up.  If not further specified `None` is\n                        returned.\n        :param type: A callable that is used to cast the value in the\n                     :class:`MultiDict`.  If a :exc:`ValueError` is raised\n                     by this callable the default value is returned.\n        \"\"\"\n        try:\n            rv = self[key]\n            if type is not None:\n                rv = type(rv)\n        except (KeyError, ValueError):\n            rv = default\n        return rv\n\n\nclass ImmutableTypeConversionDict(ImmutableDictMixin, TypeConversionDict):\n\n    \"\"\"Works like a :class:`TypeConversionDict` but does not support\n    modifications.\n\n    .. versionadded:: 0.5\n    \"\"\"\n\n    def copy(self):\n        \"\"\"Return a shallow mutable copy of this object.  Keep in mind that\n        the standard library's :func:`copy` function is a no-op for this class\n        like for any other python immutable type (eg: :class:`tuple`).\n        \"\"\"\n        return TypeConversionDict(self)\n\n    def __copy__(self):\n        return self\n\n\n@native_itermethods(['keys', 'values', 'items', 'lists', 'listvalues'])\nclass MultiDict(TypeConversionDict):\n\n    \"\"\"A :class:`MultiDict` is a dictionary subclass customized to deal with\n    multiple values for the same key which is for example used by the parsing\n    functions in the wrappers.  This is necessary because some HTML form\n    elements pass multiple values for the same key.\n\n    :class:`MultiDict` implements all standard dictionary methods.\n    Internally, it saves all values for a key as a list, but the standard dict\n    access methods will only return the first value for a key. If you want to\n    gain access to the other values, too, you have to use the `list` methods as\n    explained below.\n\n    Basic Usage:\n\n    >>> d = MultiDict([('a', 'b'), ('a', 'c')])\n    >>> d\n    MultiDict([('a', 'b'), ('a', 'c')])\n    >>> d['a']\n    'b'\n    >>> d.getlist('a')\n    ['b', 'c']\n    >>> 'a' in d\n    True\n\n    It behaves like a normal dict thus all dict functions will only return the\n    first value when multiple values for one key are found.\n\n    From Werkzeug 0.3 onwards, the `KeyError` raised by this class is also a\n    subclass of the :exc:`~exceptions.BadRequest` HTTP exception and will\n    render a page for a ``400 BAD REQUEST`` if caught in a catch-all for HTTP\n    exceptions.\n\n    A :class:`MultiDict` can be constructed from an iterable of\n    ``(key, value)`` tuples, a dict, a :class:`MultiDict` or from Werkzeug 0.2\n    onwards some keyword parameters.\n\n    :param mapping: the initial value for the :class:`MultiDict`.  Either a\n                    regular dict, an iterable of ``(key, value)`` tuples\n                    or `None`.\n    \"\"\"\n\n    def __init__(self, mapping=None):\n        if isinstance(mapping, MultiDict):\n            dict.__init__(self, ((k, l[:]) for k, l in iterlists(mapping)))\n        elif isinstance(mapping, dict):\n            tmp = {}\n            for key, value in iteritems(mapping):\n                if isinstance(value, (tuple, list)):\n                    value = list(value)\n                else:\n                    value = [value]\n                tmp[key] = value\n            dict.__init__(self, tmp)\n        else:\n            tmp = {}\n            for key, value in mapping or ():\n                tmp.setdefault(key, []).append(value)\n            dict.__init__(self, tmp)\n\n    def __getstate__(self):\n        return dict(self.lists())\n\n    def __setstate__(self, value):\n        dict.clear(self)\n        dict.update(self, value)\n\n    def __getitem__(self, key):\n        \"\"\"Return the first data value for this key;\n        raises KeyError if not found.\n\n        :param key: The key to be looked up.\n        :raise KeyError: if the key does not exist.\n        \"\"\"\n        if key in self:\n            return dict.__getitem__(self, key)[0]\n        raise exceptions.BadRequestKeyError(key)\n\n    def __setitem__(self, key, value):\n        \"\"\"Like :meth:`add` but removes an existing key first.\n\n        :param key: the key for the value.\n        :param value: the value to set.\n        \"\"\"\n        dict.__setitem__(self, key, [value])\n\n    def add(self, key, value):\n        \"\"\"Adds a new value for the key.\n\n        .. versionadded:: 0.6\n\n        :param key: the key for the value.\n        :param value: the value to add.\n        \"\"\"\n        dict.setdefault(self, key, []).append(value)\n\n    def getlist(self, key, type=None):\n        \"\"\"Return the list of items for a given key. If that key is not in the\n        `MultiDict`, the return value will be an empty list.  Just as `get`\n        `getlist` accepts a `type` parameter.  All items will be converted\n        with the callable defined there.\n\n        :param key: The key to be looked up.\n        :param type: A callable that is used to cast the value in the\n                     :class:`MultiDict`.  If a :exc:`ValueError` is raised\n                     by this callable the value will be removed from the list.\n        :return: a :class:`list` of all the values for the key.\n        \"\"\"\n        try:\n            rv = dict.__getitem__(self, key)\n        except KeyError:\n            return []\n        if type is None:\n            return list(rv)\n        result = []\n        for item in rv:\n            try:\n                result.append(type(item))\n            except ValueError:\n                pass\n        return result\n\n    def setlist(self, key, new_list):\n        \"\"\"Remove the old values for a key and add new ones.  Note that the list\n        you pass the values in will be shallow-copied before it is inserted in\n        the dictionary.\n\n        >>> d = MultiDict()\n        >>> d.setlist('foo', ['1', '2'])\n        >>> d['foo']\n        '1'\n        >>> d.getlist('foo')\n        ['1', '2']\n\n        :param key: The key for which the values are set.\n        :param new_list: An iterable with the new values for the key.  Old values\n                         are removed first.\n        \"\"\"\n        dict.__setitem__(self, key, list(new_list))\n\n    def setdefault(self, key, default=None):\n        \"\"\"Returns the value for the key if it is in the dict, otherwise it\n        returns `default` and sets that value for `key`.\n\n        :param key: The key to be looked up.\n        :param default: The default value to be returned if the key is not\n                        in the dict.  If not further specified it's `None`.\n        \"\"\"\n        if key not in self:\n            self[key] = default\n        else:\n            default = self[key]\n        return default\n\n    def setlistdefault(self, key, default_list=None):\n        \"\"\"Like `setdefault` but sets multiple values.  The list returned\n        is not a copy, but the list that is actually used internally.  This\n        means that you can put new values into the dict by appending items\n        to the list:\n\n        >>> d = MultiDict({\"foo\": 1})\n        >>> d.setlistdefault(\"foo\").extend([2, 3])\n        >>> d.getlist(\"foo\")\n        [1, 2, 3]\n\n        :param key: The key to be looked up.\n        :param default: An iterable of default values.  It is either copied\n                        (in case it was a list) or converted into a list\n                        before returned.\n        :return: a :class:`list`\n        \"\"\"\n        if key not in self:\n            default_list = list(default_list or ())\n            dict.__setitem__(self, key, default_list)\n        else:\n            default_list = dict.__getitem__(self, key)\n        return default_list\n\n    def items(self, multi=False):\n        \"\"\"Return an iterator of ``(key, value)`` pairs.\n\n        :param multi: If set to `True` the iterator returned will have a pair\n                      for each value of each key.  Otherwise it will only\n                      contain pairs for the first value of each key.\n        \"\"\"\n\n        for key, values in iteritems(dict, self):\n            if multi:\n                for value in values:\n                    yield key, value\n            else:\n                yield key, values[0]\n\n    def lists(self):\n        \"\"\"Return a list of ``(key, values)`` pairs, where values is the list\n        of all values associated with the key.\"\"\"\n\n        for key, values in iteritems(dict, self):\n            yield key, list(values)\n\n    def keys(self):\n        return iterkeys(dict, self)\n\n    __iter__ = keys\n\n    def values(self):\n        \"\"\"Returns an iterator of the first value on every key's value list.\"\"\"\n        for values in itervalues(dict, self):\n            yield values[0]\n\n    def listvalues(self):\n        \"\"\"Return an iterator of all values associated with a key.  Zipping\n        :meth:`keys` and this is the same as calling :meth:`lists`:\n\n        >>> d = MultiDict({\"foo\": [1, 2, 3]})\n        >>> zip(d.keys(), d.listvalues()) == d.lists()\n        True\n        \"\"\"\n\n        return itervalues(dict, self)\n\n    def copy(self):\n        \"\"\"Return a shallow copy of this object.\"\"\"\n        return self.__class__(self)\n\n    def deepcopy(self, memo=None):\n        \"\"\"Return a deep copy of this object.\"\"\"\n        return self.__class__(deepcopy(self.to_dict(flat=False), memo))\n\n    def to_dict(self, flat=True):\n        \"\"\"Return the contents as regular dict.  If `flat` is `True` the\n        returned dict will only have the first item present, if `flat` is\n        `False` all values will be returned as lists.\n\n        :param flat: If set to `False` the dict returned will have lists\n                     with all the values in it.  Otherwise it will only\n                     contain the first value for each key.\n        :return: a :class:`dict`\n        \"\"\"\n        if flat:\n            return dict(iteritems(self))\n        return dict(self.lists())\n\n    def update(self, other_dict):\n        \"\"\"update() extends rather than replaces existing key lists:\n\n        >>> a = MultiDict({'x': 1})\n        >>> b = MultiDict({'x': 2, 'y': 3})\n        >>> a.update(b)\n        >>> a\n        MultiDict([('y', 3), ('x', 1), ('x', 2)])\n\n        If the value list for a key in ``other_dict`` is empty, no new values\n        will be added to the dict and the key will not be created:\n\n        >>> x = {'empty_list': []}\n        >>> y = MultiDict()\n        >>> y.update(x)\n        >>> y\n        MultiDict([])\n        \"\"\"\n        for key, value in iter_multi_items(other_dict):\n            MultiDict.add(self, key, value)\n\n    def pop(self, key, default=_missing):\n        \"\"\"Pop the first item for a list on the dict.  Afterwards the\n        key is removed from the dict, so additional values are discarded:\n\n        >>> d = MultiDict({\"foo\": [1, 2, 3]})\n        >>> d.pop(\"foo\")\n        1\n        >>> \"foo\" in d\n        False\n\n        :param key: the key to pop.\n        :param default: if provided the value to return if the key was\n                        not in the dictionary.\n        \"\"\"\n        try:\n            return dict.pop(self, key)[0]\n        except KeyError as e:\n            if default is not _missing:\n                return default\n            raise exceptions.BadRequestKeyError(str(e))\n\n    def popitem(self):\n        \"\"\"Pop an item from the dict.\"\"\"\n        try:\n            item = dict.popitem(self)\n            return (item[0], item[1][0])\n        except KeyError as e:\n            raise exceptions.BadRequestKeyError(str(e))\n\n    def poplist(self, key):\n        \"\"\"Pop the list for a key from the dict.  If the key is not in the dict\n        an empty list is returned.\n\n        .. versionchanged:: 0.5\n           If the key does no longer exist a list is returned instead of\n           raising an error.\n        \"\"\"\n        return dict.pop(self, key, [])\n\n    def popitemlist(self):\n        \"\"\"Pop a ``(key, list)`` tuple from the dict.\"\"\"\n        try:\n            return dict.popitem(self)\n        except KeyError as e:\n            raise exceptions.BadRequestKeyError(str(e))\n\n    def __copy__(self):\n        return self.copy()\n\n    def __deepcopy__(self, memo):\n        return self.deepcopy(memo=memo)\n\n    def __repr__(self):\n        return '%s(%r)' % (self.__class__.__name__, list(iteritems(self, multi=True)))\n\n\nclass _omd_bucket(object):\n\n    \"\"\"Wraps values in the :class:`OrderedMultiDict`.  This makes it\n    possible to keep an order over multiple different keys.  It requires\n    a lot of extra memory and slows down access a lot, but makes it\n    possible to access elements in O(1) and iterate in O(n).\n    \"\"\"\n    __slots__ = ('prev', 'key', 'value', 'next')\n\n    def __init__(self, omd, key, value):\n        self.prev = omd._last_bucket\n        self.key = key\n        self.value = value\n        self.next = None\n\n        if omd._first_bucket is None:\n            omd._first_bucket = self\n        if omd._last_bucket is not None:\n            omd._last_bucket.next = self\n        omd._last_bucket = self\n\n    def unlink(self, omd):\n        if self.prev:\n            self.prev.next = self.next\n        if self.next:\n            self.next.prev = self.prev\n        if omd._first_bucket is self:\n            omd._first_bucket = self.next\n        if omd._last_bucket is self:\n            omd._last_bucket = self.prev\n\n\n@native_itermethods(['keys', 'values', 'items', 'lists', 'listvalues'])\nclass OrderedMultiDict(MultiDict):\n\n    \"\"\"Works like a regular :class:`MultiDict` but preserves the\n    order of the fields.  To convert the ordered multi dict into a\n    list you can use the :meth:`items` method and pass it ``multi=True``.\n\n    In general an :class:`OrderedMultiDict` is an order of magnitude\n    slower than a :class:`MultiDict`.\n\n    .. admonition:: note\n\n       Due to a limitation in Python you cannot convert an ordered\n       multi dict into a regular dict by using ``dict(multidict)``.\n       Instead you have to use the :meth:`to_dict` method, otherwise\n       the internal bucket objects are exposed.\n    \"\"\"\n\n    def __init__(self, mapping=None):\n        dict.__init__(self)\n        self._first_bucket = self._last_bucket = None\n        if mapping is not None:\n            OrderedMultiDict.update(self, mapping)\n\n    def __eq__(self, other):\n        if not isinstance(other, MultiDict):\n            return NotImplemented\n        if isinstance(other, OrderedMultiDict):\n            iter1 = iteritems(self, multi=True)\n            iter2 = iteritems(other, multi=True)\n            try:\n                for k1, v1 in iter1:\n                    k2, v2 = next(iter2)\n                    if k1 != k2 or v1 != v2:\n                        return False\n            except StopIteration:\n                return False\n            try:\n                next(iter2)\n            except StopIteration:\n                return True\n            return False\n        if len(self) != len(other):\n            return False\n        for key, values in iterlists(self):\n            if other.getlist(key) != values:\n                return False\n        return True\n\n    def __ne__(self, other):\n        return not self.__eq__(other)\n\n    def __reduce_ex__(self, protocol):\n        return type(self), (list(iteritems(self, multi=True)),)\n\n    def __getstate__(self):\n        return list(iteritems(self, multi=True))\n\n    def __setstate__(self, values):\n        dict.clear(self)\n        for key, value in values:\n            self.add(key, value)\n\n    def __getitem__(self, key):\n        if key in self:\n            return dict.__getitem__(self, key)[0].value\n        raise exceptions.BadRequestKeyError(key)\n\n    def __setitem__(self, key, value):\n        self.poplist(key)\n        self.add(key, value)\n\n    def __delitem__(self, key):\n        self.pop(key)\n\n    def keys(self):\n        return (key for key, value in iteritems(self))\n\n    __iter__ = keys\n\n    def values(self):\n        return (value for key, value in iteritems(self))\n\n    def items(self, multi=False):\n        ptr = self._first_bucket\n        if multi:\n            while ptr is not None:\n                yield ptr.key, ptr.value\n                ptr = ptr.next\n        else:\n            returned_keys = set()\n            while ptr is not None:\n                if ptr.key not in returned_keys:\n                    returned_keys.add(ptr.key)\n                    yield ptr.key, ptr.value\n                ptr = ptr.next\n\n    def lists(self):\n        returned_keys = set()\n        ptr = self._first_bucket\n        while ptr is not None:\n            if ptr.key not in returned_keys:\n                yield ptr.key, self.getlist(ptr.key)\n                returned_keys.add(ptr.key)\n            ptr = ptr.next\n\n    def listvalues(self):\n        for key, values in iterlists(self):\n            yield values\n\n    def add(self, key, value):\n        dict.setdefault(self, key, []).append(_omd_bucket(self, key, value))\n\n    def getlist(self, key, type=None):\n        try:\n            rv = dict.__getitem__(self, key)\n        except KeyError:\n            return []\n        if type is None:\n            return [x.value for x in rv]\n        result = []\n        for item in rv:\n            try:\n                result.append(type(item.value))\n            except ValueError:\n                pass\n        return result\n\n    def setlist(self, key, new_list):\n        self.poplist(key)\n        for value in new_list:\n            self.add(key, value)\n\n    def setlistdefault(self, key, default_list=None):\n        raise TypeError('setlistdefault is unsupported for '\n                        'ordered multi dicts')\n\n    def update(self, mapping):\n        for key, value in iter_multi_items(mapping):\n            OrderedMultiDict.add(self, key, value)\n\n    def poplist(self, key):\n        buckets = dict.pop(self, key, ())\n        for bucket in buckets:\n            bucket.unlink(self)\n        return [x.value for x in buckets]\n\n    def pop(self, key, default=_missing):\n        try:\n            buckets = dict.pop(self, key)\n        except KeyError as e:\n            if default is not _missing:\n                return default\n            raise exceptions.BadRequestKeyError(str(e))\n        for bucket in buckets:\n            bucket.unlink(self)\n        return buckets[0].value\n\n    def popitem(self):\n        try:\n            key, buckets = dict.popitem(self)\n        except KeyError as e:\n            raise exceptions.BadRequestKeyError(str(e))\n        for bucket in buckets:\n            bucket.unlink(self)\n        return key, buckets[0].value\n\n    def popitemlist(self):\n        try:\n            key, buckets = dict.popitem(self)\n        except KeyError as e:\n            raise exceptions.BadRequestKeyError(str(e))\n        for bucket in buckets:\n            bucket.unlink(self)\n        return key, [x.value for x in buckets]\n\n\ndef _options_header_vkw(value, kw):\n    return dump_options_header(value, dict((k.replace('_', '-'), v)\n                                           for k, v in kw.items()))\n\n\ndef _unicodify_header_value(value):\n    if isinstance(value, bytes):\n        value = value.decode('latin-1')\n    if not isinstance(value, text_type):\n        value = text_type(value)\n    return value\n\n\n@native_itermethods(['keys', 'values', 'items'])\nclass Headers(object):\n\n    \"\"\"An object that stores some headers.  It has a dict-like interface\n    but is ordered and can store the same keys multiple times.\n\n    This data structure is useful if you want a nicer way to handle WSGI\n    headers which are stored as tuples in a list.\n\n    From Werkzeug 0.3 onwards, the :exc:`KeyError` raised by this class is\n    also a subclass of the :class:`~exceptions.BadRequest` HTTP exception\n    and will render a page for a ``400 BAD REQUEST`` if caught in a\n    catch-all for HTTP exceptions.\n\n    Headers is mostly compatible with the Python :class:`wsgiref.headers.Headers`\n    class, with the exception of `__getitem__`.  :mod:`wsgiref` will return\n    `None` for ``headers['missing']``, whereas :class:`Headers` will raise\n    a :class:`KeyError`.\n\n    To create a new :class:`Headers` object pass it a list or dict of headers\n    which are used as default values.  This does not reuse the list passed\n    to the constructor for internal usage.\n\n    :param defaults: The list of default values for the :class:`Headers`.\n\n    .. versionchanged:: 0.9\n       This data structure now stores unicode values similar to how the\n       multi dicts do it.  The main difference is that bytes can be set as\n       well which will automatically be latin1 decoded.\n\n    .. versionchanged:: 0.9\n       The :meth:`linked` function was removed without replacement as it\n       was an API that does not support the changes to the encoding model.\n    \"\"\"\n\n    def __init__(self, defaults=None):\n        self._list = []\n        if defaults is not None:\n            if isinstance(defaults, (list, Headers)):\n                self._list.extend(defaults)\n            else:\n                self.extend(defaults)\n\n    def __getitem__(self, key, _get_mode=False):\n        if not _get_mode:\n            if isinstance(key, integer_types):\n                return self._list[key]\n            elif isinstance(key, slice):\n                return self.__class__(self._list[key])\n        if not isinstance(key, string_types):\n            raise exceptions.BadRequestKeyError(key)\n        ikey = key.lower()\n        for k, v in self._list:\n            if k.lower() == ikey:\n                return v\n        # micro optimization: if we are in get mode we will catch that\n        # exception one stack level down so we can raise a standard\n        # key error instead of our special one.\n        if _get_mode:\n            raise KeyError()\n        raise exceptions.BadRequestKeyError(key)\n\n    def __eq__(self, other):\n        return other.__class__ is self.__class__ and \\\n            set(other._list) == set(self._list)\n\n    def __ne__(self, other):\n        return not self.__eq__(other)\n\n    def get(self, key, default=None, type=None, as_bytes=False):\n        \"\"\"Return the default value if the requested data doesn't exist.\n        If `type` is provided and is a callable it should convert the value,\n        return it or raise a :exc:`ValueError` if that is not possible.  In\n        this case the function will return the default as if the value was not\n        found:\n\n        >>> d = Headers([('Content-Length', '42')])\n        >>> d.get('Content-Length', type=int)\n        42\n\n        If a headers object is bound you must not add unicode strings\n        because no encoding takes place.\n\n        .. versionadded:: 0.9\n           Added support for `as_bytes`.\n\n        :param key: The key to be looked up.\n        :param default: The default value to be returned if the key can't\n                        be looked up.  If not further specified `None` is\n                        returned.\n        :param type: A callable that is used to cast the value in the\n                     :class:`Headers`.  If a :exc:`ValueError` is raised\n                     by this callable the default value is returned.\n        :param as_bytes: return bytes instead of unicode strings.\n        \"\"\"\n        try:\n            rv = self.__getitem__(key, _get_mode=True)\n        except KeyError:\n            return default\n        if as_bytes:\n            rv = rv.encode('latin1')\n        if type is None:\n            return rv\n        try:\n            return type(rv)\n        except ValueError:\n            return default\n\n    def getlist(self, key, type=None, as_bytes=False):\n        \"\"\"Return the list of items for a given key. If that key is not in the\n        :class:`Headers`, the return value will be an empty list.  Just as\n        :meth:`get` :meth:`getlist` accepts a `type` parameter.  All items will\n        be converted with the callable defined there.\n\n        .. versionadded:: 0.9\n           Added support for `as_bytes`.\n\n        :param key: The key to be looked up.\n        :param type: A callable that is used to cast the value in the\n                     :class:`Headers`.  If a :exc:`ValueError` is raised\n                     by this callable the value will be removed from the list.\n        :return: a :class:`list` of all the values for the key.\n        :param as_bytes: return bytes instead of unicode strings.\n        \"\"\"\n        ikey = key.lower()\n        result = []\n        for k, v in self:\n            if k.lower() == ikey:\n                if as_bytes:\n                    v = v.encode('latin1')\n                if type is not None:\n                    try:\n                        v = type(v)\n                    except ValueError:\n                        continue\n                result.append(v)\n        return result\n\n    def get_all(self, name):\n        \"\"\"Return a list of all the values for the named field.\n\n        This method is compatible with the :mod:`wsgiref`\n        :meth:`~wsgiref.headers.Headers.get_all` method.\n        \"\"\"\n        return self.getlist(name)\n\n    def items(self, lower=False):\n        for key, value in self:\n            if lower:\n                key = key.lower()\n            yield key, value\n\n    def keys(self, lower=False):\n        for key, _ in iteritems(self, lower):\n            yield key\n\n    def values(self):\n        for _, value in iteritems(self):\n            yield value\n\n    def extend(self, iterable):\n        \"\"\"Extend the headers with a dict or an iterable yielding keys and\n        values.\n        \"\"\"\n        if isinstance(iterable, dict):\n            for key, value in iteritems(iterable):\n                if isinstance(value, (tuple, list)):\n                    for v in value:\n                        self.add(key, v)\n                else:\n                    self.add(key, value)\n        else:\n            for key, value in iterable:\n                self.add(key, value)\n\n    def __delitem__(self, key, _index_operation=True):\n        if _index_operation and isinstance(key, (integer_types, slice)):\n            del self._list[key]\n            return\n        key = key.lower()\n        new = []\n        for k, v in self._list:\n            if k.lower() != key:\n                new.append((k, v))\n        self._list[:] = new\n\n    def remove(self, key):\n        \"\"\"Remove a key.\n\n        :param key: The key to be removed.\n        \"\"\"\n        return self.__delitem__(key, _index_operation=False)\n\n    def pop(self, key=None, default=_missing):\n        \"\"\"Removes and returns a key or index.\n\n        :param key: The key to be popped.  If this is an integer the item at\n                    that position is removed, if it's a string the value for\n                    that key is.  If the key is omitted or `None` the last\n                    item is removed.\n        :return: an item.\n        \"\"\"\n        if key is None:\n            return self._list.pop()\n        if isinstance(key, integer_types):\n            return self._list.pop(key)\n        try:\n            rv = self[key]\n            self.remove(key)\n        except KeyError:\n            if default is not _missing:\n                return default\n            raise\n        return rv\n\n    def popitem(self):\n        \"\"\"Removes a key or index and returns a (key, value) item.\"\"\"\n        return self.pop()\n\n    def __contains__(self, key):\n        \"\"\"Check if a key is present.\"\"\"\n        try:\n            self.__getitem__(key, _get_mode=True)\n        except KeyError:\n            return False\n        return True\n\n    has_key = __contains__\n\n    def __iter__(self):\n        \"\"\"Yield ``(key, value)`` tuples.\"\"\"\n        return iter(self._list)\n\n    def __len__(self):\n        return len(self._list)\n\n    def add(self, _key, _value, **kw):\n        \"\"\"Add a new header tuple to the list.\n\n        Keyword arguments can specify additional parameters for the header\n        value, with underscores converted to dashes::\n\n        >>> d = Headers()\n        >>> d.add('Content-Type', 'text/plain')\n        >>> d.add('Content-Disposition', 'attachment', filename='foo.png')\n\n        The keyword argument dumping uses :func:`dump_options_header`\n        behind the scenes.\n\n        .. versionadded:: 0.4.1\n            keyword arguments were added for :mod:`wsgiref` compatibility.\n        \"\"\"\n        if kw:\n            _value = _options_header_vkw(_value, kw)\n        _value = _unicodify_header_value(_value)\n        self._validate_value(_value)\n        self._list.append((_key, _value))\n\n    def _validate_value(self, value):\n        if not isinstance(value, text_type):\n            raise TypeError('Value should be unicode.')\n        if u'\\n' in value or u'\\r' in value:\n            raise ValueError('Detected newline in header value.  This is '\n                             'a potential security problem')\n\n    def add_header(self, _key, _value, **_kw):\n        \"\"\"Add a new header tuple to the list.\n\n        An alias for :meth:`add` for compatibility with the :mod:`wsgiref`\n        :meth:`~wsgiref.headers.Headers.add_header` method.\n        \"\"\"\n        self.add(_key, _value, **_kw)\n\n    def clear(self):\n        \"\"\"Clears all headers.\"\"\"\n        del self._list[:]\n\n    def set(self, _key, _value, **kw):\n        \"\"\"Remove all header tuples for `key` and add a new one.  The newly\n        added key either appears at the end of the list if there was no\n        entry or replaces the first one.\n\n        Keyword arguments can specify additional parameters for the header\n        value, with underscores converted to dashes.  See :meth:`add` for\n        more information.\n\n        .. versionchanged:: 0.6.1\n           :meth:`set` now accepts the same arguments as :meth:`add`.\n\n        :param key: The key to be inserted.\n        :param value: The value to be inserted.\n        \"\"\"\n        if kw:\n            _value = _options_header_vkw(_value, kw)\n        _value = _unicodify_header_value(_value)\n        self._validate_value(_value)\n        if not self._list:\n            self._list.append((_key, _value))\n            return\n        listiter = iter(self._list)\n        ikey = _key.lower()\n        for idx, (old_key, old_value) in enumerate(listiter):\n            if old_key.lower() == ikey:\n                # replace first ocurrence\n                self._list[idx] = (_key, _value)\n                break\n        else:\n            self._list.append((_key, _value))\n            return\n        self._list[idx + 1:] = [t for t in listiter if t[0].lower() != ikey]\n\n    def setdefault(self, key, value):\n        \"\"\"Returns the value for the key if it is in the dict, otherwise it\n        returns `default` and sets that value for `key`.\n\n        :param key: The key to be looked up.\n        :param default: The default value to be returned if the key is not\n                        in the dict.  If not further specified it's `None`.\n        \"\"\"\n        if key in self:\n            return self[key]\n        self.set(key, value)\n        return value\n\n    def __setitem__(self, key, value):\n        \"\"\"Like :meth:`set` but also supports index/slice based setting.\"\"\"\n        if isinstance(key, (slice, integer_types)):\n            if isinstance(key, integer_types):\n                value = [value]\n            value = [(k, _unicodify_header_value(v)) for (k, v) in value]\n            [self._validate_value(v) for (k, v) in value]\n            if isinstance(key, integer_types):\n                self._list[key] = value[0]\n            else:\n                self._list[key] = value\n        else:\n            self.set(key, value)\n\n    def to_list(self, charset='iso-8859-1'):\n        \"\"\"Convert the headers into a list suitable for WSGI.\"\"\"\n        from warnings import warn\n        warn(DeprecationWarning('Method removed, use to_wsgi_list instead'),\n             stacklevel=2)\n        return self.to_wsgi_list()\n\n    def to_wsgi_list(self):\n        \"\"\"Convert the headers into a list suitable for WSGI.\n\n        The values are byte strings in Python 2 converted to latin1 and unicode\n        strings in Python 3 for the WSGI server to encode.\n\n        :return: list\n        \"\"\"\n        if PY2:\n            return [(to_native(k), v.encode('latin1')) for k, v in self]\n        return list(self)\n\n    def copy(self):\n        return self.__class__(self._list)\n\n    def __copy__(self):\n        return self.copy()\n\n    def __str__(self):\n        \"\"\"Returns formatted headers suitable for HTTP transmission.\"\"\"\n        strs = []\n        for key, value in self.to_wsgi_list():\n            strs.append('%s: %s' % (key, value))\n        strs.append('\\r\\n')\n        return '\\r\\n'.join(strs)\n\n    def __repr__(self):\n        return '%s(%r)' % (\n            self.__class__.__name__,\n            list(self)\n        )\n\n\nclass ImmutableHeadersMixin(object):\n\n    \"\"\"Makes a :class:`Headers` immutable.  We do not mark them as\n    hashable though since the only usecase for this datastructure\n    in Werkzeug is a view on a mutable structure.\n\n    .. versionadded:: 0.5\n\n    :private:\n    \"\"\"\n\n    def __delitem__(self, key):\n        is_immutable(self)\n\n    def __setitem__(self, key, value):\n        is_immutable(self)\n    set = __setitem__\n\n    def add(self, item):\n        is_immutable(self)\n    remove = add_header = add\n\n    def extend(self, iterable):\n        is_immutable(self)\n\n    def insert(self, pos, value):\n        is_immutable(self)\n\n    def pop(self, index=-1):\n        is_immutable(self)\n\n    def popitem(self):\n        is_immutable(self)\n\n    def setdefault(self, key, default):\n        is_immutable(self)\n\n\nclass EnvironHeaders(ImmutableHeadersMixin, Headers):\n\n    \"\"\"Read only version of the headers from a WSGI environment.  This\n    provides the same interface as `Headers` and is constructed from\n    a WSGI environment.\n\n    From Werkzeug 0.3 onwards, the `KeyError` raised by this class is also a\n    subclass of the :exc:`~exceptions.BadRequest` HTTP exception and will\n    render a page for a ``400 BAD REQUEST`` if caught in a catch-all for\n    HTTP exceptions.\n    \"\"\"\n\n    def __init__(self, environ):\n        self.environ = environ\n\n    def __eq__(self, other):\n        return self.environ is other.environ\n\n    def __getitem__(self, key, _get_mode=False):\n        # _get_mode is a no-op for this class as there is no index but\n        # used because get() calls it.\n        key = key.upper().replace('-', '_')\n        if key in ('CONTENT_TYPE', 'CONTENT_LENGTH'):\n            return _unicodify_header_value(self.environ[key])\n        return _unicodify_header_value(self.environ['HTTP_' + key])\n\n    def __len__(self):\n        # the iter is necessary because otherwise list calls our\n        # len which would call list again and so forth.\n        return len(list(iter(self)))\n\n    def __iter__(self):\n        for key, value in iteritems(self.environ):\n            if key.startswith('HTTP_') and key not in \\\n               ('HTTP_CONTENT_TYPE', 'HTTP_CONTENT_LENGTH'):\n                yield (key[5:].replace('_', '-').title(),\n                       _unicodify_header_value(value))\n            elif key in ('CONTENT_TYPE', 'CONTENT_LENGTH'):\n                yield (key.replace('_', '-').title(),\n                       _unicodify_header_value(value))\n\n    def copy(self):\n        raise TypeError('cannot create %r copies' % self.__class__.__name__)\n\n\n@native_itermethods(['keys', 'values', 'items', 'lists', 'listvalues'])\nclass CombinedMultiDict(ImmutableMultiDictMixin, MultiDict):\n\n    \"\"\"A read only :class:`MultiDict` that you can pass multiple :class:`MultiDict`\n    instances as sequence and it will combine the return values of all wrapped\n    dicts:\n\n    >>> from werkzeug.datastructures import CombinedMultiDict, MultiDict\n    >>> post = MultiDict([('foo', 'bar')])\n    >>> get = MultiDict([('blub', 'blah')])\n    >>> combined = CombinedMultiDict([get, post])\n    >>> combined['foo']\n    'bar'\n    >>> combined['blub']\n    'blah'\n\n    This works for all read operations and will raise a `TypeError` for\n    methods that usually change data which isn't possible.\n\n    From Werkzeug 0.3 onwards, the `KeyError` raised by this class is also a\n    subclass of the :exc:`~exceptions.BadRequest` HTTP exception and will\n    render a page for a ``400 BAD REQUEST`` if caught in a catch-all for HTTP\n    exceptions.\n    \"\"\"\n\n    def __reduce_ex__(self, protocol):\n        return type(self), (self.dicts,)\n\n    def __init__(self, dicts=None):\n        self.dicts = dicts or []\n\n    @classmethod\n    def fromkeys(cls):\n        raise TypeError('cannot create %r instances by fromkeys' %\n                        cls.__name__)\n\n    def __getitem__(self, key):\n        for d in self.dicts:\n            if key in d:\n                return d[key]\n        raise exceptions.BadRequestKeyError(key)\n\n    def get(self, key, default=None, type=None):\n        for d in self.dicts:\n            if key in d:\n                if type is not None:\n                    try:\n                        return type(d[key])\n                    except ValueError:\n                        continue\n                return d[key]\n        return default\n\n    def getlist(self, key, type=None):\n        rv = []\n        for d in self.dicts:\n            rv.extend(d.getlist(key, type))\n        return rv\n\n    def _keys_impl(self):\n        \"\"\"This function exists so __len__ can be implemented more efficiently,\n        saving one list creation from an iterator.\n\n        Using this for Python 2's ``dict.keys`` behavior would be useless since\n        `dict.keys` in Python 2 returns a list, while we have a set here.\n        \"\"\"\n        rv = set()\n        for d in self.dicts:\n            rv.update(iterkeys(d))\n        return rv\n\n    def keys(self):\n        return iter(self._keys_impl())\n\n    __iter__ = keys\n\n    def items(self, multi=False):\n        found = set()\n        for d in self.dicts:\n            for key, value in iteritems(d, multi):\n                if multi:\n                    yield key, value\n                elif key not in found:\n                    found.add(key)\n                    yield key, value\n\n    def values(self):\n        for key, value in iteritems(self):\n            yield value\n\n    def lists(self):\n        rv = {}\n        for d in self.dicts:\n            for key, values in iterlists(d):\n                rv.setdefault(key, []).extend(values)\n        return iteritems(rv)\n\n    def listvalues(self):\n        return (x[1] for x in self.lists())\n\n    def copy(self):\n        \"\"\"Return a shallow copy of this object.\"\"\"\n        return self.__class__(self.dicts[:])\n\n    def to_dict(self, flat=True):\n        \"\"\"Return the contents as regular dict.  If `flat` is `True` the\n        returned dict will only have the first item present, if `flat` is\n        `False` all values will be returned as lists.\n\n        :param flat: If set to `False` the dict returned will have lists\n                     with all the values in it.  Otherwise it will only\n                     contain the first item for each key.\n        :return: a :class:`dict`\n        \"\"\"\n        rv = {}\n        for d in reversed(self.dicts):\n            rv.update(d.to_dict(flat))\n        return rv\n\n    def __len__(self):\n        return len(self._keys_impl())\n\n    def __contains__(self, key):\n        for d in self.dicts:\n            if key in d:\n                return True\n        return False\n\n    has_key = __contains__\n\n    def __repr__(self):\n        return '%s(%r)' % (self.__class__.__name__, self.dicts)\n\n\nclass FileMultiDict(MultiDict):\n\n    \"\"\"A special :class:`MultiDict` that has convenience methods to add\n    files to it.  This is used for :class:`EnvironBuilder` and generally\n    useful for unittesting.\n\n    .. versionadded:: 0.5\n    \"\"\"\n\n    def add_file(self, name, file, filename=None, content_type=None):\n        \"\"\"Adds a new file to the dict.  `file` can be a file name or\n        a :class:`file`-like or a :class:`FileStorage` object.\n\n        :param name: the name of the field.\n        :param file: a filename or :class:`file`-like object\n        :param filename: an optional filename\n        :param content_type: an optional content type\n        \"\"\"\n        if isinstance(file, FileStorage):\n            value = file\n        else:\n            if isinstance(file, string_types):\n                if filename is None:\n                    filename = file\n                file = open(file, 'rb')\n            if filename and content_type is None:\n                content_type = mimetypes.guess_type(filename)[0] or \\\n                    'application/octet-stream'\n            value = FileStorage(file, filename, name, content_type)\n\n        self.add(name, value)\n\n\nclass ImmutableDict(ImmutableDictMixin, dict):\n\n    \"\"\"An immutable :class:`dict`.\n\n    .. versionadded:: 0.5\n    \"\"\"\n\n    def __repr__(self):\n        return '%s(%s)' % (\n            self.__class__.__name__,\n            dict.__repr__(self),\n        )\n\n    def copy(self):\n        \"\"\"Return a shallow mutable copy of this object.  Keep in mind that\n        the standard library's :func:`copy` function is a no-op for this class\n        like for any other python immutable type (eg: :class:`tuple`).\n        \"\"\"\n        return dict(self)\n\n    def __copy__(self):\n        return self\n\n\nclass ImmutableMultiDict(ImmutableMultiDictMixin, MultiDict):\n\n    \"\"\"An immutable :class:`MultiDict`.\n\n    .. versionadded:: 0.5\n    \"\"\"\n\n    def copy(self):\n        \"\"\"Return a shallow mutable copy of this object.  Keep in mind that\n        the standard library's :func:`copy` function is a no-op for this class\n        like for any other python immutable type (eg: :class:`tuple`).\n        \"\"\"\n        return MultiDict(self)\n\n    def __copy__(self):\n        return self\n\n\nclass ImmutableOrderedMultiDict(ImmutableMultiDictMixin, OrderedMultiDict):\n\n    \"\"\"An immutable :class:`OrderedMultiDict`.\n\n    .. versionadded:: 0.6\n    \"\"\"\n\n    def _iter_hashitems(self):\n        return enumerate(iteritems(self, multi=True))\n\n    def copy(self):\n        \"\"\"Return a shallow mutable copy of this object.  Keep in mind that\n        the standard library's :func:`copy` function is a no-op for this class\n        like for any other python immutable type (eg: :class:`tuple`).\n        \"\"\"\n        return OrderedMultiDict(self)\n\n    def __copy__(self):\n        return self\n\n\n@native_itermethods(['values'])\nclass Accept(ImmutableList):\n\n    \"\"\"An :class:`Accept` object is just a list subclass for lists of\n    ``(value, quality)`` tuples.  It is automatically sorted by quality.\n\n    All :class:`Accept` objects work similar to a list but provide extra\n    functionality for working with the data.  Containment checks are\n    normalized to the rules of that header:\n\n    >>> a = CharsetAccept([('ISO-8859-1', 1), ('utf-8', 0.7)])\n    >>> a.best\n    'ISO-8859-1'\n    >>> 'iso-8859-1' in a\n    True\n    >>> 'UTF8' in a\n    True\n    >>> 'utf7' in a\n    False\n\n    To get the quality for an item you can use normal item lookup:\n\n    >>> print a['utf-8']\n    0.7\n    >>> a['utf7']\n    0\n\n    .. versionchanged:: 0.5\n       :class:`Accept` objects are forced immutable now.\n    \"\"\"\n\n    def __init__(self, values=()):\n        if values is None:\n            list.__init__(self)\n            self.provided = False\n        elif isinstance(values, Accept):\n            self.provided = values.provided\n            list.__init__(self, values)\n        else:\n            self.provided = True\n            values = [(a, b) for b, a in values]\n            values.sort()\n            values.reverse()\n            list.__init__(self, [(a, b) for b, a in values])\n\n    def _value_matches(self, value, item):\n        \"\"\"Check if a value matches a given accept item.\"\"\"\n        return item == '*' or item.lower() == value.lower()\n\n    def __getitem__(self, key):\n        \"\"\"Besides index lookup (getting item n) you can also pass it a string\n        to get the quality for the item.  If the item is not in the list, the\n        returned quality is ``0``.\n        \"\"\"\n        if isinstance(key, string_types):\n            return self.quality(key)\n        return list.__getitem__(self, key)\n\n    def quality(self, key):\n        \"\"\"Returns the quality of the key.\n\n        .. versionadded:: 0.6\n           In previous versions you had to use the item-lookup syntax\n           (eg: ``obj[key]`` instead of ``obj.quality(key)``)\n        \"\"\"\n        for item, quality in self:\n            if self._value_matches(key, item):\n                return quality\n        return 0\n\n    def __contains__(self, value):\n        for item, quality in self:\n            if self._value_matches(value, item):\n                return True\n        return False\n\n    def __repr__(self):\n        return '%s([%s])' % (\n            self.__class__.__name__,\n            ', '.join('(%r, %s)' % (x, y) for x, y in self)\n        )\n\n    def index(self, key):\n        \"\"\"Get the position of an entry or raise :exc:`ValueError`.\n\n        :param key: The key to be looked up.\n\n        .. versionchanged:: 0.5\n           This used to raise :exc:`IndexError`, which was inconsistent\n           with the list API.\n        \"\"\"\n        if isinstance(key, string_types):\n            for idx, (item, quality) in enumerate(self):\n                if self._value_matches(key, item):\n                    return idx\n            raise ValueError(key)\n        return list.index(self, key)\n\n    def find(self, key):\n        \"\"\"Get the position of an entry or return -1.\n\n        :param key: The key to be looked up.\n        \"\"\"\n        try:\n            return self.index(key)\n        except ValueError:\n            return -1\n\n    def values(self):\n        \"\"\"Iterate over all values.\"\"\"\n        for item in self:\n            yield item[0]\n\n    def to_header(self):\n        \"\"\"Convert the header set into an HTTP header string.\"\"\"\n        result = []\n        for value, quality in self:\n            if quality != 1:\n                value = '%s;q=%s' % (value, quality)\n            result.append(value)\n        return ','.join(result)\n\n    def __str__(self):\n        return self.to_header()\n\n    def best_match(self, matches, default=None):\n        \"\"\"Returns the best match from a list of possible matches based\n        on the quality of the client.  If two items have the same quality,\n        the one is returned that comes first.\n\n        :param matches: a list of matches to check for\n        :param default: the value that is returned if none match\n        \"\"\"\n        best_quality = -1\n        result = default\n        for server_item in matches:\n            for client_item, quality in self:\n                if quality <= best_quality:\n                    break\n                if self._value_matches(server_item, client_item) \\\n                   and quality > 0:\n                    best_quality = quality\n                    result = server_item\n        return result\n\n    @property\n    def best(self):\n        \"\"\"The best match as value.\"\"\"\n        if self:\n            return self[0][0]\n\n\nclass MIMEAccept(Accept):\n\n    \"\"\"Like :class:`Accept` but with special methods and behavior for\n    mimetypes.\n    \"\"\"\n\n    def _value_matches(self, value, item):\n        def _normalize(x):\n            x = x.lower()\n            return x == '*' and ('*', '*') or x.split('/', 1)\n\n        # this is from the application which is trusted.  to avoid developer\n        # frustration we actually check these for valid values\n        if '/' not in value:\n            raise ValueError('invalid mimetype %r' % value)\n        value_type, value_subtype = _normalize(value)\n        if value_type == '*' and value_subtype != '*':\n            raise ValueError('invalid mimetype %r' % value)\n\n        if '/' not in item:\n            return False\n        item_type, item_subtype = _normalize(item)\n        if item_type == '*' and item_subtype != '*':\n            return False\n        return (\n            (item_type == item_subtype == '*' or\n             value_type == value_subtype == '*') or\n            (item_type == value_type and (item_subtype == '*' or\n                                          value_subtype == '*' or\n                                          item_subtype == value_subtype))\n        )\n\n    @property\n    def accept_html(self):\n        \"\"\"True if this object accepts HTML.\"\"\"\n        return (\n            'text/html' in self or\n            'application/xhtml+xml' in self or\n            self.accept_xhtml\n        )\n\n    @property\n    def accept_xhtml(self):\n        \"\"\"True if this object accepts XHTML.\"\"\"\n        return (\n            'application/xhtml+xml' in self or\n            'application/xml' in self\n        )\n\n    @property\n    def accept_json(self):\n        \"\"\"True if this object accepts JSON.\"\"\"\n        return 'application/json' in self\n\n\nclass LanguageAccept(Accept):\n\n    \"\"\"Like :class:`Accept` but with normalization for languages.\"\"\"\n\n    def _value_matches(self, value, item):\n        def _normalize(language):\n            return _locale_delim_re.split(language.lower())\n        return item == '*' or _normalize(value) == _normalize(item)\n\n\nclass CharsetAccept(Accept):\n\n    \"\"\"Like :class:`Accept` but with normalization for charsets.\"\"\"\n\n    def _value_matches(self, value, item):\n        def _normalize(name):\n            try:\n                return codecs.lookup(name).name\n            except LookupError:\n                return name.lower()\n        return item == '*' or _normalize(value) == _normalize(item)\n\n\ndef cache_property(key, empty, type):\n    \"\"\"Return a new property object for a cache header.  Useful if you\n    want to add support for a cache extension in a subclass.\"\"\"\n    return property(lambda x: x._get_cache_value(key, empty, type),\n                    lambda x, v: x._set_cache_value(key, v, type),\n                    lambda x: x._del_cache_value(key),\n                    'accessor for %r' % key)\n\n\nclass _CacheControl(UpdateDictMixin, dict):\n\n    \"\"\"Subclass of a dict that stores values for a Cache-Control header.  It\n    has accessors for all the cache-control directives specified in RFC 2616.\n    The class does not differentiate between request and response directives.\n\n    Because the cache-control directives in the HTTP header use dashes the\n    python descriptors use underscores for that.\n\n    To get a header of the :class:`CacheControl` object again you can convert\n    the object into a string or call the :meth:`to_header` method.  If you plan\n    to subclass it and add your own items have a look at the sourcecode for\n    that class.\n\n    .. versionchanged:: 0.4\n\n       Setting `no_cache` or `private` to boolean `True` will set the implicit\n       none-value which is ``*``:\n\n       >>> cc = ResponseCacheControl()\n       >>> cc.no_cache = True\n       >>> cc\n       <ResponseCacheControl 'no-cache'>\n       >>> cc.no_cache\n       '*'\n       >>> cc.no_cache = None\n       >>> cc\n       <ResponseCacheControl ''>\n\n       In versions before 0.5 the behavior documented here affected the now\n       no longer existing `CacheControl` class.\n    \"\"\"\n\n    no_cache = cache_property('no-cache', '*', None)\n    no_store = cache_property('no-store', None, bool)\n    max_age = cache_property('max-age', -1, int)\n    no_transform = cache_property('no-transform', None, None)\n\n    def __init__(self, values=(), on_update=None):\n        dict.__init__(self, values or ())\n        self.on_update = on_update\n        self.provided = values is not None\n\n    def _get_cache_value(self, key, empty, type):\n        \"\"\"Used internally by the accessor properties.\"\"\"\n        if type is bool:\n            return key in self\n        if key in self:\n            value = self[key]\n            if value is None:\n                return empty\n            elif type is not None:\n                try:\n                    value = type(value)\n                except ValueError:\n                    pass\n            return value\n\n    def _set_cache_value(self, key, value, type):\n        \"\"\"Used internally by the accessor properties.\"\"\"\n        if type is bool:\n            if value:\n                self[key] = None\n            else:\n                self.pop(key, None)\n        else:\n            if value is None:\n                self.pop(key)\n            elif value is True:\n                self[key] = None\n            else:\n                self[key] = value\n\n    def _del_cache_value(self, key):\n        \"\"\"Used internally by the accessor properties.\"\"\"\n        if key in self:\n            del self[key]\n\n    def to_header(self):\n        \"\"\"Convert the stored values into a cache control header.\"\"\"\n        return dump_header(self)\n\n    def __str__(self):\n        return self.to_header()\n\n    def __repr__(self):\n        return '<%s %s>' % (\n            self.__class__.__name__,\n            \" \".join(\n                \"%s=%r\" % (k, v) for k, v in sorted(self.items())\n            ),\n        )\n\n\nclass RequestCacheControl(ImmutableDictMixin, _CacheControl):\n\n    \"\"\"A cache control for requests.  This is immutable and gives access\n    to all the request-relevant cache control headers.\n\n    To get a header of the :class:`RequestCacheControl` object again you can\n    convert the object into a string or call the :meth:`to_header` method.  If\n    you plan to subclass it and add your own items have a look at the sourcecode\n    for that class.\n\n    .. versionadded:: 0.5\n       In previous versions a `CacheControl` class existed that was used\n       both for request and response.\n    \"\"\"\n\n    max_stale = cache_property('max-stale', '*', int)\n    min_fresh = cache_property('min-fresh', '*', int)\n    no_transform = cache_property('no-transform', None, None)\n    only_if_cached = cache_property('only-if-cached', None, bool)\n\n\nclass ResponseCacheControl(_CacheControl):\n\n    \"\"\"A cache control for responses.  Unlike :class:`RequestCacheControl`\n    this is mutable and gives access to response-relevant cache control\n    headers.\n\n    To get a header of the :class:`ResponseCacheControl` object again you can\n    convert the object into a string or call the :meth:`to_header` method.  If\n    you plan to subclass it and add your own items have a look at the sourcecode\n    for that class.\n\n    .. versionadded:: 0.5\n       In previous versions a `CacheControl` class existed that was used\n       both for request and response.\n    \"\"\"\n\n    public = cache_property('public', None, bool)\n    private = cache_property('private', '*', None)\n    must_revalidate = cache_property('must-revalidate', None, bool)\n    proxy_revalidate = cache_property('proxy-revalidate', None, bool)\n    s_maxage = cache_property('s-maxage', None, None)\n\n\n# attach cache_property to the _CacheControl as staticmethod\n# so that others can reuse it.\n_CacheControl.cache_property = staticmethod(cache_property)\n\n\nclass CallbackDict(UpdateDictMixin, dict):\n\n    \"\"\"A dict that calls a function passed every time something is changed.\n    The function is passed the dict instance.\n    \"\"\"\n\n    def __init__(self, initial=None, on_update=None):\n        dict.__init__(self, initial or ())\n        self.on_update = on_update\n\n    def __repr__(self):\n        return '<%s %s>' % (\n            self.__class__.__name__,\n            dict.__repr__(self)\n        )\n\n\nclass HeaderSet(object):\n\n    \"\"\"Similar to the :class:`ETags` class this implements a set-like structure.\n    Unlike :class:`ETags` this is case insensitive and used for vary, allow, and\n    content-language headers.\n\n    If not constructed using the :func:`parse_set_header` function the\n    instantiation works like this:\n\n    >>> hs = HeaderSet(['foo', 'bar', 'baz'])\n    >>> hs\n    HeaderSet(['foo', 'bar', 'baz'])\n    \"\"\"\n\n    def __init__(self, headers=None, on_update=None):\n        self._headers = list(headers or ())\n        self._set = set([x.lower() for x in self._headers])\n        self.on_update = on_update\n\n    def add(self, header):\n        \"\"\"Add a new header to the set.\"\"\"\n        self.update((header,))\n\n    def remove(self, header):\n        \"\"\"Remove a header from the set.  This raises an :exc:`KeyError` if the\n        header is not in the set.\n\n        .. versionchanged:: 0.5\n            In older versions a :exc:`IndexError` was raised instead of a\n            :exc:`KeyError` if the object was missing.\n\n        :param header: the header to be removed.\n        \"\"\"\n        key = header.lower()\n        if key not in self._set:\n            raise KeyError(header)\n        self._set.remove(key)\n        for idx, key in enumerate(self._headers):\n            if key.lower() == header:\n                del self._headers[idx]\n                break\n        if self.on_update is not None:\n            self.on_update(self)\n\n    def update(self, iterable):\n        \"\"\"Add all the headers from the iterable to the set.\n\n        :param iterable: updates the set with the items from the iterable.\n        \"\"\"\n        inserted_any = False\n        for header in iterable:\n            key = header.lower()\n            if key not in self._set:\n                self._headers.append(header)\n                self._set.add(key)\n                inserted_any = True\n        if inserted_any and self.on_update is not None:\n            self.on_update(self)\n\n    def discard(self, header):\n        \"\"\"Like :meth:`remove` but ignores errors.\n\n        :param header: the header to be discarded.\n        \"\"\"\n        try:\n            return self.remove(header)\n        except KeyError:\n            pass\n\n    def find(self, header):\n        \"\"\"Return the index of the header in the set or return -1 if not found.\n\n        :param header: the header to be looked up.\n        \"\"\"\n        header = header.lower()\n        for idx, item in enumerate(self._headers):\n            if item.lower() == header:\n                return idx\n        return -1\n\n    def index(self, header):\n        \"\"\"Return the index of the header in the set or raise an\n        :exc:`IndexError`.\n\n        :param header: the header to be looked up.\n        \"\"\"\n        rv = self.find(header)\n        if rv < 0:\n            raise IndexError(header)\n        return rv\n\n    def clear(self):\n        \"\"\"Clear the set.\"\"\"\n        self._set.clear()\n        del self._headers[:]\n        if self.on_update is not None:\n            self.on_update(self)\n\n    def as_set(self, preserve_casing=False):\n        \"\"\"Return the set as real python set type.  When calling this, all\n        the items are converted to lowercase and the ordering is lost.\n\n        :param preserve_casing: if set to `True` the items in the set returned\n                                will have the original case like in the\n                                :class:`HeaderSet`, otherwise they will\n                                be lowercase.\n        \"\"\"\n        if preserve_casing:\n            return set(self._headers)\n        return set(self._set)\n\n    def to_header(self):\n        \"\"\"Convert the header set into an HTTP header string.\"\"\"\n        return ', '.join(map(quote_header_value, self._headers))\n\n    def __getitem__(self, idx):\n        return self._headers[idx]\n\n    def __delitem__(self, idx):\n        rv = self._headers.pop(idx)\n        self._set.remove(rv.lower())\n        if self.on_update is not None:\n            self.on_update(self)\n\n    def __setitem__(self, idx, value):\n        old = self._headers[idx]\n        self._set.remove(old.lower())\n        self._headers[idx] = value\n        self._set.add(value.lower())\n        if self.on_update is not None:\n            self.on_update(self)\n\n    def __contains__(self, header):\n        return header.lower() in self._set\n\n    def __len__(self):\n        return len(self._set)\n\n    def __iter__(self):\n        return iter(self._headers)\n\n    def __nonzero__(self):\n        return bool(self._set)\n\n    def __str__(self):\n        return self.to_header()\n\n    def __repr__(self):\n        return '%s(%r)' % (\n            self.__class__.__name__,\n            self._headers\n        )\n\n\nclass ETags(object):\n\n    \"\"\"A set that can be used to check if one etag is present in a collection\n    of etags.\n    \"\"\"\n\n    def __init__(self, strong_etags=None, weak_etags=None, star_tag=False):\n        self._strong = frozenset(not star_tag and strong_etags or ())\n        self._weak = frozenset(weak_etags or ())\n        self.star_tag = star_tag\n\n    def as_set(self, include_weak=False):\n        \"\"\"Convert the `ETags` object into a python set.  Per default all the\n        weak etags are not part of this set.\"\"\"\n        rv = set(self._strong)\n        if include_weak:\n            rv.update(self._weak)\n        return rv\n\n    def is_weak(self, etag):\n        \"\"\"Check if an etag is weak.\"\"\"\n        return etag in self._weak\n\n    def contains_weak(self, etag):\n        \"\"\"Check if an etag is part of the set including weak and strong tags.\"\"\"\n        return self.is_weak(etag) or self.contains(etag)\n\n    def contains(self, etag):\n        \"\"\"Check if an etag is part of the set ignoring weak tags.\n        It is also possible to use the ``in`` operator.\n\n        \"\"\"\n        if self.star_tag:\n            return True\n        return etag in self._strong\n\n    def contains_raw(self, etag):\n        \"\"\"When passed a quoted tag it will check if this tag is part of the\n        set.  If the tag is weak it is checked against weak and strong tags,\n        otherwise strong only.\"\"\"\n        etag, weak = unquote_etag(etag)\n        if weak:\n            return self.contains_weak(etag)\n        return self.contains(etag)\n\n    def to_header(self):\n        \"\"\"Convert the etags set into a HTTP header string.\"\"\"\n        if self.star_tag:\n            return '*'\n        return ', '.join(\n            ['\"%s\"' % x for x in self._strong] +\n            ['w/\"%s\"' % x for x in self._weak]\n        )\n\n    def __call__(self, etag=None, data=None, include_weak=False):\n        if [etag, data].count(None) != 1:\n            raise TypeError('either tag or data required, but at least one')\n        if etag is None:\n            etag = generate_etag(data)\n        if include_weak:\n            if etag in self._weak:\n                return True\n        return etag in self._strong\n\n    def __bool__(self):\n        return bool(self.star_tag or self._strong or self._weak)\n\n    __nonzero__ = __bool__\n\n    def __str__(self):\n        return self.to_header()\n\n    def __iter__(self):\n        return iter(self._strong)\n\n    def __contains__(self, etag):\n        return self.contains(etag)\n\n    def __repr__(self):\n        return '<%s %r>' % (self.__class__.__name__, str(self))\n\n\nclass IfRange(object):\n\n    \"\"\"Very simple object that represents the `If-Range` header in parsed\n    form.  It will either have neither a etag or date or one of either but\n    never both.\n\n    .. versionadded:: 0.7\n    \"\"\"\n\n    def __init__(self, etag=None, date=None):\n        #: The etag parsed and unquoted.  Ranges always operate on strong\n        #: etags so the weakness information is not necessary.\n        self.etag = etag\n        #: The date in parsed format or `None`.\n        self.date = date\n\n    def to_header(self):\n        \"\"\"Converts the object back into an HTTP header.\"\"\"\n        if self.date is not None:\n            return http_date(self.date)\n        if self.etag is not None:\n            return quote_etag(self.etag)\n        return ''\n\n    def __str__(self):\n        return self.to_header()\n\n    def __repr__(self):\n        return '<%s %r>' % (self.__class__.__name__, str(self))\n\n\nclass Range(object):\n\n    \"\"\"Represents a range header.  All the methods are only supporting bytes\n    as unit.  It does store multiple ranges but :meth:`range_for_length` will\n    only work if only one range is provided.\n\n    .. versionadded:: 0.7\n    \"\"\"\n\n    def __init__(self, units, ranges):\n        #: The units of this range.  Usually \"bytes\".\n        self.units = units\n        #: A list of ``(begin, end)`` tuples for the range header provided.\n        #: The ranges are non-inclusive.\n        self.ranges = ranges\n\n    def range_for_length(self, length):\n        \"\"\"If the range is for bytes, the length is not None and there is\n        exactly one range and it is satisfiable it returns a ``(start, stop)``\n        tuple, otherwise `None`.\n        \"\"\"\n        if self.units != 'bytes' or length is None or len(self.ranges) != 1:\n            return None\n        start, end = self.ranges[0]\n        if end is None:\n            end = length\n            if start < 0:\n                start += length\n        if is_byte_range_valid(start, end, length):\n            return start, min(end, length)\n\n    def make_content_range(self, length):\n        \"\"\"Creates a :class:`~werkzeug.datastructures.ContentRange` object\n        from the current range and given content length.\n        \"\"\"\n        rng = self.range_for_length(length)\n        if rng is not None:\n            return ContentRange(self.units, rng[0], rng[1], length)\n\n    def to_header(self):\n        \"\"\"Converts the object back into an HTTP header.\"\"\"\n        ranges = []\n        for begin, end in self.ranges:\n            if end is None:\n                ranges.append(begin >= 0 and '%s-' % begin or str(begin))\n            else:\n                ranges.append('%s-%s' % (begin, end - 1))\n        return '%s=%s' % (self.units, ','.join(ranges))\n\n    def __str__(self):\n        return self.to_header()\n\n    def __repr__(self):\n        return '<%s %r>' % (self.__class__.__name__, str(self))\n\n\nclass ContentRange(object):\n\n    \"\"\"Represents the content range header.\n\n    .. versionadded:: 0.7\n    \"\"\"\n\n    def __init__(self, units, start, stop, length=None, on_update=None):\n        assert is_byte_range_valid(start, stop, length), \\\n            'Bad range provided'\n        self.on_update = on_update\n        self.set(start, stop, length, units)\n\n    def _callback_property(name):\n        def fget(self):\n            return getattr(self, name)\n\n        def fset(self, value):\n            setattr(self, name, value)\n            if self.on_update is not None:\n                self.on_update(self)\n        return property(fget, fset)\n\n    #: The units to use, usually \"bytes\"\n    units = _callback_property('_units')\n    #: The start point of the range or `None`.\n    start = _callback_property('_start')\n    #: The stop point of the range (non-inclusive) or `None`.  Can only be\n    #: `None` if also start is `None`.\n    stop = _callback_property('_stop')\n    #: The length of the range or `None`.\n    length = _callback_property('_length')\n\n    def set(self, start, stop, length=None, units='bytes'):\n        \"\"\"Simple method to update the ranges.\"\"\"\n        assert is_byte_range_valid(start, stop, length), \\\n            'Bad range provided'\n        self._units = units\n        self._start = start\n        self._stop = stop\n        self._length = length\n        if self.on_update is not None:\n            self.on_update(self)\n\n    def unset(self):\n        \"\"\"Sets the units to `None` which indicates that the header should\n        no longer be used.\n        \"\"\"\n        self.set(None, None, units=None)\n\n    def to_header(self):\n        if self.units is None:\n            return ''\n        if self.length is None:\n            length = '*'\n        else:\n            length = self.length\n        if self.start is None:\n            return '%s */%s' % (self.units, length)\n        return '%s %s-%s/%s' % (\n            self.units,\n            self.start,\n            self.stop - 1,\n            length\n        )\n\n    def __nonzero__(self):\n        return self.units is not None\n\n    __bool__ = __nonzero__\n\n    def __str__(self):\n        return self.to_header()\n\n    def __repr__(self):\n        return '<%s %r>' % (self.__class__.__name__, str(self))\n\n\nclass Authorization(ImmutableDictMixin, dict):\n\n    \"\"\"Represents an `Authorization` header sent by the client.  You should\n    not create this kind of object yourself but use it when it's returned by\n    the `parse_authorization_header` function.\n\n    This object is a dict subclass and can be altered by setting dict items\n    but it should be considered immutable as it's returned by the client and\n    not meant for modifications.\n\n    .. versionchanged:: 0.5\n       This object became immutable.\n    \"\"\"\n\n    def __init__(self, auth_type, data=None):\n        dict.__init__(self, data or {})\n        self.type = auth_type\n\n    username = property(lambda x: x.get('username'), doc='''\n        The username transmitted.  This is set for both basic and digest\n        auth all the time.''')\n    password = property(lambda x: x.get('password'), doc='''\n        When the authentication type is basic this is the password\n        transmitted by the client, else `None`.''')\n    realm = property(lambda x: x.get('realm'), doc='''\n        This is the server realm sent back for HTTP digest auth.''')\n    nonce = property(lambda x: x.get('nonce'), doc='''\n        The nonce the server sent for digest auth, sent back by the client.\n        A nonce should be unique for every 401 response for HTTP digest\n        auth.''')\n    uri = property(lambda x: x.get('uri'), doc='''\n        The URI from Request-URI of the Request-Line; duplicated because\n        proxies are allowed to change the Request-Line in transit.  HTTP\n        digest auth only.''')\n    nc = property(lambda x: x.get('nc'), doc='''\n        The nonce count value transmitted by clients if a qop-header is\n        also transmitted.  HTTP digest auth only.''')\n    cnonce = property(lambda x: x.get('cnonce'), doc='''\n        If the server sent a qop-header in the ``WWW-Authenticate``\n        header, the client has to provide this value for HTTP digest auth.\n        See the RFC for more details.''')\n    response = property(lambda x: x.get('response'), doc='''\n        A string of 32 hex digits computed as defined in RFC 2617, which\n        proves that the user knows a password.  Digest auth only.''')\n    opaque = property(lambda x: x.get('opaque'), doc='''\n        The opaque header from the server returned unchanged by the client.\n        It is recommended that this string be base64 or hexadecimal data.\n        Digest auth only.''')\n\n    @property\n    def qop(self):\n        \"\"\"Indicates what \"quality of protection\" the client has applied to\n        the message for HTTP digest auth.\"\"\"\n        def on_update(header_set):\n            if not header_set and 'qop' in self:\n                del self['qop']\n            elif header_set:\n                self['qop'] = header_set.to_header()\n        return parse_set_header(self.get('qop'), on_update)\n\n\nclass WWWAuthenticate(UpdateDictMixin, dict):\n\n    \"\"\"Provides simple access to `WWW-Authenticate` headers.\"\"\"\n\n    #: list of keys that require quoting in the generated header\n    _require_quoting = frozenset(['domain', 'nonce', 'opaque', 'realm', 'qop'])\n\n    def __init__(self, auth_type=None, values=None, on_update=None):\n        dict.__init__(self, values or ())\n        if auth_type:\n            self['__auth_type__'] = auth_type\n        self.on_update = on_update\n\n    def set_basic(self, realm='authentication required'):\n        \"\"\"Clear the auth info and enable basic auth.\"\"\"\n        dict.clear(self)\n        dict.update(self, {'__auth_type__': 'basic', 'realm': realm})\n        if self.on_update:\n            self.on_update(self)\n\n    def set_digest(self, realm, nonce, qop=('auth',), opaque=None,\n                   algorithm=None, stale=False):\n        \"\"\"Clear the auth info and enable digest auth.\"\"\"\n        d = {\n            '__auth_type__':    'digest',\n            'realm':            realm,\n            'nonce':            nonce,\n            'qop':              dump_header(qop)\n        }\n        if stale:\n            d['stale'] = 'TRUE'\n        if opaque is not None:\n            d['opaque'] = opaque\n        if algorithm is not None:\n            d['algorithm'] = algorithm\n        dict.clear(self)\n        dict.update(self, d)\n        if self.on_update:\n            self.on_update(self)\n\n    def to_header(self):\n        \"\"\"Convert the stored values into a WWW-Authenticate header.\"\"\"\n        d = dict(self)\n        auth_type = d.pop('__auth_type__', None) or 'basic'\n        return '%s %s' % (auth_type.title(), ', '.join([\n            '%s=%s' % (key, quote_header_value(value,\n                                               allow_token=key not in self._require_quoting))\n            for key, value in iteritems(d)\n        ]))\n\n    def __str__(self):\n        return self.to_header()\n\n    def __repr__(self):\n        return '<%s %r>' % (\n            self.__class__.__name__,\n            self.to_header()\n        )\n\n    def auth_property(name, doc=None):\n        \"\"\"A static helper function for subclasses to add extra authentication\n        system properties onto a class::\n\n            class FooAuthenticate(WWWAuthenticate):\n                special_realm = auth_property('special_realm')\n\n        For more information have a look at the sourcecode to see how the\n        regular properties (:attr:`realm` etc.) are implemented.\n        \"\"\"\n\n        def _set_value(self, value):\n            if value is None:\n                self.pop(name, None)\n            else:\n                self[name] = str(value)\n        return property(lambda x: x.get(name), _set_value, doc=doc)\n\n    def _set_property(name, doc=None):\n        def fget(self):\n            def on_update(header_set):\n                if not header_set and name in self:\n                    del self[name]\n                elif header_set:\n                    self[name] = header_set.to_header()\n            return parse_set_header(self.get(name), on_update)\n        return property(fget, doc=doc)\n\n    type = auth_property('__auth_type__', doc='''\n        The type of the auth mechanism.  HTTP currently specifies\n        `Basic` and `Digest`.''')\n    realm = auth_property('realm', doc='''\n        A string to be displayed to users so they know which username and\n        password to use.  This string should contain at least the name of\n        the host performing the authentication and might additionally\n        indicate the collection of users who might have access.''')\n    domain = _set_property('domain', doc='''\n        A list of URIs that define the protection space.  If a URI is an\n        absolute path, it is relative to the canonical root URL of the\n        server being accessed.''')\n    nonce = auth_property('nonce', doc='''\n        A server-specified data string which should be uniquely generated\n        each time a 401 response is made.  It is recommended that this\n        string be base64 or hexadecimal data.''')\n    opaque = auth_property('opaque', doc='''\n        A string of data, specified by the server, which should be returned\n        by the client unchanged in the Authorization header of subsequent\n        requests with URIs in the same protection space.  It is recommended\n        that this string be base64 or hexadecimal data.''')\n    algorithm = auth_property('algorithm', doc='''\n        A string indicating a pair of algorithms used to produce the digest\n        and a checksum.  If this is not present it is assumed to be \"MD5\".\n        If the algorithm is not understood, the challenge should be ignored\n        (and a different one used, if there is more than one).''')\n    qop = _set_property('qop', doc='''\n        A set of quality-of-privacy directives such as auth and auth-int.''')\n\n    def _get_stale(self):\n        val = self.get('stale')\n        if val is not None:\n            return val.lower() == 'true'\n\n    def _set_stale(self, value):\n        if value is None:\n            self.pop('stale', None)\n        else:\n            self['stale'] = value and 'TRUE' or 'FALSE'\n    stale = property(_get_stale, _set_stale, doc='''\n        A flag, indicating that the previous request from the client was\n        rejected because the nonce value was stale.''')\n    del _get_stale, _set_stale\n\n    # make auth_property a staticmethod so that subclasses of\n    # `WWWAuthenticate` can use it for new properties.\n    auth_property = staticmethod(auth_property)\n    del _set_property\n\n\nclass FileStorage(object):\n\n    \"\"\"The :class:`FileStorage` class is a thin wrapper over incoming files.\n    It is used by the request object to represent uploaded files.  All the\n    attributes of the wrapper stream are proxied by the file storage so\n    it's possible to do ``storage.read()`` instead of the long form\n    ``storage.stream.read()``.\n    \"\"\"\n\n    def __init__(self, stream=None, filename=None, name=None,\n                 content_type=None, content_length=None,\n                 headers=None):\n        self.name = name\n        self.stream = stream or _empty_stream\n\n        # if no filename is provided we can attempt to get the filename\n        # from the stream object passed.  There we have to be careful to\n        # skip things like <fdopen>, <stderr> etc.  Python marks these\n        # special filenames with angular brackets.\n        if filename is None:\n            filename = getattr(stream, 'name', None)\n            s = make_literal_wrapper(filename)\n            if filename and filename[0] == s('<') and filename[-1] == s('>'):\n                filename = None\n\n            # On Python 3 we want to make sure the filename is always unicode.\n            # This might not be if the name attribute is bytes due to the\n            # file being opened from the bytes API.\n            if not PY2 and isinstance(filename, bytes):\n                filename = filename.decode(get_filesystem_encoding(),\n                                           'replace')\n\n        self.filename = filename\n        if headers is None:\n            headers = Headers()\n        self.headers = headers\n        if content_type is not None:\n            headers['Content-Type'] = content_type\n        if content_length is not None:\n            headers['Content-Length'] = str(content_length)\n\n    def _parse_content_type(self):\n        if not hasattr(self, '_parsed_content_type'):\n            self._parsed_content_type = \\\n                parse_options_header(self.content_type)\n\n    @property\n    def content_type(self):\n        \"\"\"The content-type sent in the header.  Usually not available\"\"\"\n        return self.headers.get('content-type')\n\n    @property\n    def content_length(self):\n        \"\"\"The content-length sent in the header.  Usually not available\"\"\"\n        return int(self.headers.get('content-length') or 0)\n\n    @property\n    def mimetype(self):\n        \"\"\"Like :attr:`content_type`, but without parameters (eg, without\n        charset, type etc.) and always lowercase.  For example if the content\n        type is ``text/HTML; charset=utf-8`` the mimetype would be\n        ``'text/html'``.\n\n        .. versionadded:: 0.7\n        \"\"\"\n        self._parse_content_type()\n        return self._parsed_content_type[0].lower()\n\n    @property\n    def mimetype_params(self):\n        \"\"\"The mimetype parameters as dict.  For example if the content\n        type is ``text/html; charset=utf-8`` the params would be\n        ``{'charset': 'utf-8'}``.\n\n        .. versionadded:: 0.7\n        \"\"\"\n        self._parse_content_type()\n        return self._parsed_content_type[1]\n\n    def save(self, dst, buffer_size=16384):\n        \"\"\"Save the file to a destination path or file object.  If the\n        destination is a file object you have to close it yourself after the\n        call.  The buffer size is the number of bytes held in memory during\n        the copy process.  It defaults to 16KB.\n\n        For secure file saving also have a look at :func:`secure_filename`.\n\n        :param dst: a filename or open file object the uploaded file\n                    is saved to.\n        :param buffer_size: the size of the buffer.  This works the same as\n                            the `length` parameter of\n                            :func:`shutil.copyfileobj`.\n        \"\"\"\n        from shutil import copyfileobj\n        close_dst = False\n        if isinstance(dst, string_types):\n            dst = open(dst, 'wb')\n            close_dst = True\n        try:\n            copyfileobj(self.stream, dst, buffer_size)\n        finally:\n            if close_dst:\n                dst.close()\n\n    def close(self):\n        \"\"\"Close the underlying file if possible.\"\"\"\n        try:\n            self.stream.close()\n        except Exception:\n            pass\n\n    def __nonzero__(self):\n        return bool(self.filename)\n    __bool__ = __nonzero__\n\n    def __getattr__(self, name):\n        return getattr(self.stream, name)\n\n    def __iter__(self):\n        return iter(self.readline, '')\n\n    def __repr__(self):\n        return '<%s: %r (%r)>' % (\n            self.__class__.__name__,\n            self.filename,\n            self.content_type\n        )\n\n\n# circular dependencies\nfrom werkzeug.http import dump_options_header, dump_header, generate_etag, \\\n    quote_header_value, parse_set_header, unquote_etag, quote_etag, \\\n    parse_options_header, http_date, is_byte_range_valid\nfrom werkzeug import exceptions\n"
  },
  {
    "path": "lib/werkzeug/debug/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    werkzeug.debug\n    ~~~~~~~~~~~~~~\n\n    WSGI application traceback debugger.\n\n    :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nimport os\nimport sys\nimport uuid\nimport json\nimport time\nimport getpass\nimport hashlib\nimport mimetypes\nfrom os.path import join, dirname, basename, isfile\nfrom werkzeug.wrappers import BaseRequest as Request, BaseResponse as Response\nfrom werkzeug.http import parse_cookie\nfrom werkzeug.debug.tbtools import get_current_traceback, render_console_html\nfrom werkzeug.debug.console import Console\nfrom werkzeug.security import gen_salt\nfrom werkzeug._internal import _log\nfrom werkzeug._compat import text_type\n\n\n# DEPRECATED\n#: import this here because it once was documented as being available\n#: from this module.  In case there are users left ...\nfrom werkzeug.debug.repr import debug_repr  # noqa\n\n\nPIN_TIME = 60 * 60 * 8\n\n\nclass _ConsoleFrame(object):\n\n    \"\"\"Helper class so that we can reuse the frame console code for the\n    standalone console.\n    \"\"\"\n\n    def __init__(self, namespace):\n        self.console = Console(namespace)\n        self.id = 0\n\n\ndef get_pin_and_cookie_name(app):\n    \"\"\"Given an application object this returns a semi-stable 9 digit pin\n    code and a random key.  The hope is that this is stable between\n    restarts to not make debugging particularly frustrating.  If the pin\n    was forcefully disabled this returns `None`.\n\n    Second item in the resulting tuple is the cookie name for remembering.\n    \"\"\"\n    pin = os.environ.get('WERKZEUG_DEBUG_PIN')\n    rv = None\n    num = None\n\n    # Pin was explicitly disabled\n    if pin == 'off':\n        return None, None\n\n    # Pin was provided explicitly\n    if pin is not None and pin.replace('-', '').isdigit():\n        # If there are separators in the pin, return it directly\n        if '-' in pin:\n            rv = pin\n        else:\n            num = pin\n\n    modname = getattr(app, '__module__',\n                      getattr(app.__class__, '__module__'))\n    bits = [\n        getpass.getuser(),\n        str(uuid.getnode()),\n        modname,\n        getattr(app, '__name__', getattr(app.__class__, '__name__')),\n    ]\n\n    mod = sys.modules.get(modname)\n    bits.append(getattr(mod, '__file__', None))\n\n    h = hashlib.md5()\n    for bit in bits:\n        if not bit:\n            continue\n        if isinstance(bit, text_type):\n            bit = bit.encode('utf-8')\n        h.update(bit)\n\n    if num is None:\n        num = ('%09d' % int(h.hexdigest(), 16))[:9]\n\n    h.update('cookiesalt')\n    cookie_name = '__wzd' + h.hexdigest()[:12]\n\n    # Format the pincode in groups of digits for easier remembering if\n    # we don't have a result yet.\n    if rv is None:\n        for group_size in 5, 4, 3:\n            if len(num) % group_size == 0:\n                rv = '-'.join(num[x:x + group_size].rjust(group_size, '0')\n                              for x in range(0, len(num), group_size))\n                break\n        else:\n            rv = num\n\n    return rv, cookie_name\n\n\nclass DebuggedApplication(object):\n    \"\"\"Enables debugging support for a given application::\n\n        from werkzeug.debug import DebuggedApplication\n        from myapp import app\n        app = DebuggedApplication(app, evalex=True)\n\n    The `evalex` keyword argument allows evaluating expressions in a\n    traceback's frame context.\n\n    .. versionadded:: 0.9\n       The `lodgeit_url` parameter was deprecated.\n\n    :param app: the WSGI application to run debugged.\n    :param evalex: enable exception evaluation feature (interactive\n                   debugging).  This requires a non-forking server.\n    :param request_key: The key that points to the request object in ths\n                        environment.  This parameter is ignored in current\n                        versions.\n    :param console_path: the URL for a general purpose console.\n    :param console_init_func: the function that is executed before starting\n                              the general purpose console.  The return value\n                              is used as initial namespace.\n    :param show_hidden_frames: by default hidden traceback frames are skipped.\n                               You can show them by setting this parameter\n                               to `True`.\n    :param pin_security: can be used to disable the pin based security system.\n    :param pin_logging: enables the logging of the pin system.\n    \"\"\"\n\n    def __init__(self, app, evalex=False, request_key='werkzeug.request',\n                 console_path='/console', console_init_func=None,\n                 show_hidden_frames=False, lodgeit_url=None,\n                 pin_security=True, pin_logging=True):\n        if lodgeit_url is not None:\n            from warnings import warn\n            warn(DeprecationWarning('Werkzeug now pastes into gists.'))\n        if not console_init_func:\n            console_init_func = None\n        self.app = app\n        self.evalex = evalex\n        self.frames = {}\n        self.tracebacks = {}\n        self.request_key = request_key\n        self.console_path = console_path\n        self.console_init_func = console_init_func\n        self.show_hidden_frames = show_hidden_frames\n        self.secret = gen_salt(20)\n        self._failed_pin_auth = 0\n\n        self.pin_logging = pin_logging\n        if pin_security:\n            # Print out the pin for the debugger on standard out.\n            if os.environ.get('WERKZEUG_RUN_MAIN') == 'true' and \\\n               pin_logging:\n                _log('warning', ' * Debugger is active!')\n                if self.pin is None:\n                    _log('warning', ' * Debugger pin disabled.  '\n                         'DEBUGGER UNSECURED!')\n                else:\n                    _log('info', ' * Debugger pin code: %s' % self.pin)\n        else:\n            self.pin = None\n\n    def _get_pin(self):\n        if not hasattr(self, '_pin'):\n            self._pin, self._pin_cookie = get_pin_and_cookie_name(self.app)\n        return self._pin\n\n    def _set_pin(self, value):\n        self._pin = value\n\n    pin = property(_get_pin, _set_pin)\n    del _get_pin, _set_pin\n\n    @property\n    def pin_cookie_name(self):\n        \"\"\"The name of the pin cookie.\"\"\"\n        if not hasattr(self, '_pin_cookie'):\n            self._pin, self._pin_cookie = get_pin_and_cookie_name(self.app)\n        return self._pin_cookie\n\n    def debug_application(self, environ, start_response):\n        \"\"\"Run the application and conserve the traceback frames.\"\"\"\n        app_iter = None\n        try:\n            app_iter = self.app(environ, start_response)\n            for item in app_iter:\n                yield item\n            if hasattr(app_iter, 'close'):\n                app_iter.close()\n        except Exception:\n            if hasattr(app_iter, 'close'):\n                app_iter.close()\n            traceback = get_current_traceback(\n                skip=1, show_hidden_frames=self.show_hidden_frames,\n                ignore_system_exceptions=True)\n            for frame in traceback.frames:\n                self.frames[frame.id] = frame\n            self.tracebacks[traceback.id] = traceback\n\n            try:\n                start_response('500 INTERNAL SERVER ERROR', [\n                    ('Content-Type', 'text/html; charset=utf-8'),\n                    # Disable Chrome's XSS protection, the debug\n                    # output can cause false-positives.\n                    ('X-XSS-Protection', '0'),\n                ])\n            except Exception:\n                # if we end up here there has been output but an error\n                # occurred.  in that situation we can do nothing fancy any\n                # more, better log something into the error log and fall\n                # back gracefully.\n                environ['wsgi.errors'].write(\n                    'Debugging middleware caught exception in streamed '\n                    'response at a point where response headers were already '\n                    'sent.\\n')\n            else:\n                is_trusted = self.is_trusted(environ)\n                yield traceback.render_full(evalex=self.evalex,\n                                            evalex_trusted=is_trusted,\n                                            secret=self.secret) \\\n                    .encode('utf-8', 'replace')\n\n            traceback.log(environ['wsgi.errors'])\n\n    def execute_command(self, request, command, frame):\n        \"\"\"Execute a command in a console.\"\"\"\n        return Response(frame.console.eval(command), mimetype='text/html')\n\n    def display_console(self, request):\n        \"\"\"Display a standalone shell.\"\"\"\n        if 0 not in self.frames:\n            if self.console_init_func is None:\n                ns = {}\n            else:\n                ns = dict(self.console_init_func())\n            ns.setdefault('app', self.app)\n            self.frames[0] = _ConsoleFrame(ns)\n        is_trusted = self.is_trusted(request.environ)\n        return Response(render_console_html(secret=self.secret,\n                                            evalex_trusted=is_trusted),\n                        mimetype='text/html')\n\n    def paste_traceback(self, request, traceback):\n        \"\"\"Paste the traceback and return a JSON response.\"\"\"\n        rv = traceback.paste()\n        return Response(json.dumps(rv), mimetype='application/json')\n\n    def get_resource(self, request, filename):\n        \"\"\"Return a static resource from the shared folder.\"\"\"\n        filename = join(dirname(__file__), 'shared', basename(filename))\n        if isfile(filename):\n            mimetype = mimetypes.guess_type(filename)[0] \\\n                or 'application/octet-stream'\n            f = open(filename, 'rb')\n            try:\n                return Response(f.read(), mimetype=mimetype)\n            finally:\n                f.close()\n        return Response('Not Found', status=404)\n\n    def is_trusted(self, environ):\n        \"\"\"Checks if the request passed the pin test.\"\"\"\n        if self.pin is None:\n            return True\n        ts = parse_cookie(environ).get(self.pin_cookie_name, type=int)\n        if ts is None:\n            return False\n        return (time.time() - PIN_TIME) < ts\n\n    def pin_auth(self, request):\n        \"\"\"Authenticates with the pin.\"\"\"\n        exhausted = False\n        auth = False\n        if self.is_trusted(request.environ):\n            auth = True\n        elif self._failed_pin_auth > 10:\n            exhausted = True\n        else:\n            entered_pin = request.args.get('pin')\n            if entered_pin.strip().replace('-', '') == \\\n               self.pin.replace('-', ''):\n                self._failed_pin_auth = 0\n                auth = True\n            else:\n                time.sleep(self._failed_pin_auth > 5 and 5.0 or 0.5)\n                self._failed_pin_auth += 1\n                auth = False\n\n        rv = Response(json.dumps({\n            'auth': auth,\n            'exhausted': exhausted,\n        }), mimetype='application/json')\n        if auth:\n            rv.set_cookie(self.pin_cookie_name, str(int(time.time())),\n                          httponly=True)\n        return rv\n\n    def log_pin_request(self):\n        \"\"\"Log the pin if needed.\"\"\"\n        if self.pin_logging and self.pin is not None:\n            _log('info', ' * To enable the debugger you need to '\n                 'enter the security pin:')\n            _log('info', ' * Debugger pin code: %s' % self.pin)\n        return Response('')\n\n    def __call__(self, environ, start_response):\n        \"\"\"Dispatch the requests.\"\"\"\n        # important: don't ever access a function here that reads the incoming\n        # form data!  Otherwise the application won't have access to that data\n        # any more!\n        request = Request(environ)\n        response = self.debug_application\n        if request.args.get('__debugger__') == 'yes':\n            cmd = request.args.get('cmd')\n            arg = request.args.get('f')\n            secret = request.args.get('s')\n            traceback = self.tracebacks.get(request.args.get('tb', type=int))\n            frame = self.frames.get(request.args.get('frm', type=int))\n            if cmd == 'resource' and arg:\n                response = self.get_resource(request, arg)\n            elif cmd == 'paste' and traceback is not None and \\\n                    secret == self.secret:\n                response = self.paste_traceback(request, traceback)\n            elif cmd == 'pinauth' and secret == self.secret:\n                response = self.pin_auth(request)\n            elif cmd == 'printpin' and secret == self.secret:\n                response = self.log_pin_request()\n            elif self.evalex and cmd is not None and frame is not None \\\n                    and self.secret == secret and \\\n                    self.is_trusted(environ):\n                response = self.execute_command(request, cmd, frame)\n        elif self.evalex and self.console_path is not None and \\\n                request.path == self.console_path:\n            response = self.display_console(request)\n        return response(environ, start_response)\n"
  },
  {
    "path": "lib/werkzeug/debug/console.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    werkzeug.debug.console\n    ~~~~~~~~~~~~~~~~~~~~~~\n\n    Interactive console support.\n\n    :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details.\n    :license: BSD.\n\"\"\"\nimport sys\nimport code\nfrom types import CodeType\n\nfrom werkzeug.utils import escape\nfrom werkzeug.local import Local\nfrom werkzeug.debug.repr import debug_repr, dump, helper\n\n\n_local = Local()\n\n\nclass HTMLStringO(object):\n\n    \"\"\"A StringO version that HTML escapes on write.\"\"\"\n\n    def __init__(self):\n        self._buffer = []\n\n    def isatty(self):\n        return False\n\n    def close(self):\n        pass\n\n    def flush(self):\n        pass\n\n    def seek(self, n, mode=0):\n        pass\n\n    def readline(self):\n        if len(self._buffer) == 0:\n            return ''\n        ret = self._buffer[0]\n        del self._buffer[0]\n        return ret\n\n    def reset(self):\n        val = ''.join(self._buffer)\n        del self._buffer[:]\n        return val\n\n    def _write(self, x):\n        if isinstance(x, bytes):\n            x = x.decode('utf-8', 'replace')\n        self._buffer.append(x)\n\n    def write(self, x):\n        self._write(escape(x))\n\n    def writelines(self, x):\n        self._write(escape(''.join(x)))\n\n\nclass ThreadedStream(object):\n\n    \"\"\"Thread-local wrapper for sys.stdout for the interactive console.\"\"\"\n\n    def push():\n        if not isinstance(sys.stdout, ThreadedStream):\n            sys.stdout = ThreadedStream()\n        _local.stream = HTMLStringO()\n    push = staticmethod(push)\n\n    def fetch():\n        try:\n            stream = _local.stream\n        except AttributeError:\n            return ''\n        return stream.reset()\n    fetch = staticmethod(fetch)\n\n    def displayhook(obj):\n        try:\n            stream = _local.stream\n        except AttributeError:\n            return _displayhook(obj)\n        # stream._write bypasses escaping as debug_repr is\n        # already generating HTML for us.\n        if obj is not None:\n            _local._current_ipy.locals['_'] = obj\n            stream._write(debug_repr(obj))\n    displayhook = staticmethod(displayhook)\n\n    def __setattr__(self, name, value):\n        raise AttributeError('read only attribute %s' % name)\n\n    def __dir__(self):\n        return dir(sys.__stdout__)\n\n    def __getattribute__(self, name):\n        if name == '__members__':\n            return dir(sys.__stdout__)\n        try:\n            stream = _local.stream\n        except AttributeError:\n            stream = sys.__stdout__\n        return getattr(stream, name)\n\n    def __repr__(self):\n        return repr(sys.__stdout__)\n\n\n# add the threaded stream as display hook\n_displayhook = sys.displayhook\nsys.displayhook = ThreadedStream.displayhook\n\n\nclass _ConsoleLoader(object):\n\n    def __init__(self):\n        self._storage = {}\n\n    def register(self, code, source):\n        self._storage[id(code)] = source\n        # register code objects of wrapped functions too.\n        for var in code.co_consts:\n            if isinstance(var, CodeType):\n                self._storage[id(var)] = source\n\n    def get_source_by_code(self, code):\n        try:\n            return self._storage[id(code)]\n        except KeyError:\n            pass\n\n\ndef _wrap_compiler(console):\n    compile = console.compile\n\n    def func(source, filename, symbol):\n        code = compile(source, filename, symbol)\n        console.loader.register(code, source)\n        return code\n    console.compile = func\n\n\nclass _InteractiveConsole(code.InteractiveInterpreter):\n\n    def __init__(self, globals, locals):\n        code.InteractiveInterpreter.__init__(self, locals)\n        self.globals = dict(globals)\n        self.globals['dump'] = dump\n        self.globals['help'] = helper\n        self.globals['__loader__'] = self.loader = _ConsoleLoader()\n        self.more = False\n        self.buffer = []\n        _wrap_compiler(self)\n\n    def runsource(self, source):\n        source = source.rstrip() + '\\n'\n        ThreadedStream.push()\n        prompt = self.more and '... ' or '>>> '\n        try:\n            source_to_eval = ''.join(self.buffer + [source])\n            if code.InteractiveInterpreter.runsource(self,\n                                                     source_to_eval, '<debugger>', 'single'):\n                self.more = True\n                self.buffer.append(source)\n            else:\n                self.more = False\n                del self.buffer[:]\n        finally:\n            output = ThreadedStream.fetch()\n        return prompt + source + output\n\n    def runcode(self, code):\n        try:\n            eval(code, self.globals, self.locals)\n        except Exception:\n            self.showtraceback()\n\n    def showtraceback(self):\n        from werkzeug.debug.tbtools import get_current_traceback\n        tb = get_current_traceback(skip=1)\n        sys.stdout._write(tb.render_summary())\n\n    def showsyntaxerror(self, filename=None):\n        from werkzeug.debug.tbtools import get_current_traceback\n        tb = get_current_traceback(skip=4)\n        sys.stdout._write(tb.render_summary())\n\n    def write(self, data):\n        sys.stdout.write(data)\n\n\nclass Console(object):\n\n    \"\"\"An interactive console.\"\"\"\n\n    def __init__(self, globals=None, locals=None):\n        if locals is None:\n            locals = {}\n        if globals is None:\n            globals = {}\n        self._ipy = _InteractiveConsole(globals, locals)\n\n    def eval(self, code):\n        _local._current_ipy = self._ipy\n        old_sys_stdout = sys.stdout\n        try:\n            return self._ipy.runsource(code)\n        finally:\n            sys.stdout = old_sys_stdout\n"
  },
  {
    "path": "lib/werkzeug/debug/repr.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    werkzeug.debug.repr\n    ~~~~~~~~~~~~~~~~~~~\n\n    This module implements object representations for debugging purposes.\n    Unlike the default repr these reprs expose a lot more information and\n    produce HTML instead of ASCII.\n\n    Together with the CSS and JavaScript files of the debugger this gives\n    a colorful and more compact output.\n\n    :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details.\n    :license: BSD.\n\"\"\"\nimport sys\nimport re\nimport codecs\nfrom traceback import format_exception_only\ntry:\n    from collections import deque\nexcept ImportError:  # pragma: no cover\n    deque = None\nfrom werkzeug.utils import escape\nfrom werkzeug._compat import iteritems, PY2, text_type, integer_types, \\\n    string_types\n\n\nmissing = object()\n_paragraph_re = re.compile(r'(?:\\r\\n|\\r|\\n){2,}')\nRegexType = type(_paragraph_re)\n\n\nHELP_HTML = '''\\\n<div class=box>\n  <h3>%(title)s</h3>\n  <pre class=help>%(text)s</pre>\n</div>\\\n'''\nOBJECT_DUMP_HTML = '''\\\n<div class=box>\n  <h3>%(title)s</h3>\n  %(repr)s\n  <table>%(items)s</table>\n</div>\\\n'''\n\n\ndef debug_repr(obj):\n    \"\"\"Creates a debug repr of an object as HTML unicode string.\"\"\"\n    return DebugReprGenerator().repr(obj)\n\n\ndef dump(obj=missing):\n    \"\"\"Print the object details to stdout._write (for the interactive\n    console of the web debugger.\n    \"\"\"\n    gen = DebugReprGenerator()\n    if obj is missing:\n        rv = gen.dump_locals(sys._getframe(1).f_locals)\n    else:\n        rv = gen.dump_object(obj)\n    sys.stdout._write(rv)\n\n\nclass _Helper(object):\n\n    \"\"\"Displays an HTML version of the normal help, for the interactive\n    debugger only because it requires a patched sys.stdout.\n    \"\"\"\n\n    def __repr__(self):\n        return 'Type help(object) for help about object.'\n\n    def __call__(self, topic=None):\n        if topic is None:\n            sys.stdout._write('<span class=help>%s</span>' % repr(self))\n            return\n        import pydoc\n        pydoc.help(topic)\n        rv = sys.stdout.reset()\n        if isinstance(rv, bytes):\n            rv = rv.decode('utf-8', 'ignore')\n        paragraphs = _paragraph_re.split(rv)\n        if len(paragraphs) > 1:\n            title = paragraphs[0]\n            text = '\\n\\n'.join(paragraphs[1:])\n        else:  # pragma: no cover\n            title = 'Help'\n            text = paragraphs[0]\n        sys.stdout._write(HELP_HTML % {'title': title, 'text': text})\n\n\nhelper = _Helper()\n\n\ndef _add_subclass_info(inner, obj, base):\n    if isinstance(base, tuple):\n        for base in base:\n            if type(obj) is base:\n                return inner\n    elif type(obj) is base:\n        return inner\n    module = ''\n    if obj.__class__.__module__ not in ('__builtin__', 'exceptions'):\n        module = '<span class=\"module\">%s.</span>' % obj.__class__.__module__\n    return '%s%s(%s)' % (module, obj.__class__.__name__, inner)\n\n\nclass DebugReprGenerator(object):\n\n    def __init__(self):\n        self._stack = []\n\n    def _sequence_repr_maker(left, right, base=object(), limit=8):\n        def proxy(self, obj, recursive):\n            if recursive:\n                return _add_subclass_info(left + '...' + right, obj, base)\n            buf = [left]\n            have_extended_section = False\n            for idx, item in enumerate(obj):\n                if idx:\n                    buf.append(', ')\n                if idx == limit:\n                    buf.append('<span class=\"extended\">')\n                    have_extended_section = True\n                buf.append(self.repr(item))\n            if have_extended_section:\n                buf.append('</span>')\n            buf.append(right)\n            return _add_subclass_info(u''.join(buf), obj, base)\n        return proxy\n\n    list_repr = _sequence_repr_maker('[', ']', list)\n    tuple_repr = _sequence_repr_maker('(', ')', tuple)\n    set_repr = _sequence_repr_maker('set([', '])', set)\n    frozenset_repr = _sequence_repr_maker('frozenset([', '])', frozenset)\n    if deque is not None:\n        deque_repr = _sequence_repr_maker('<span class=\"module\">collections.'\n                                          '</span>deque([', '])', deque)\n    del _sequence_repr_maker\n\n    def regex_repr(self, obj):\n        pattern = repr(obj.pattern)\n        if PY2:\n            pattern = pattern.decode('string-escape', 'ignore')\n        else:\n            pattern = codecs.decode(pattern, 'unicode-escape', 'ignore')\n        if pattern[:1] == 'u':\n            pattern = 'ur' + pattern[1:]\n        else:\n            pattern = 'r' + pattern\n        return u're.compile(<span class=\"string regex\">%s</span>)' % pattern\n\n    def string_repr(self, obj, limit=70):\n        buf = ['<span class=\"string\">']\n        escaped = escape(obj)\n        a = repr(escaped[:limit])\n        b = repr(escaped[limit:])\n        if isinstance(obj, text_type) and PY2:\n            buf.append('u')\n            a = a[1:]\n            b = b[1:]\n        if b != \"''\":\n            buf.extend((a[:-1], '<span class=\"extended\">', b[1:], '</span>'))\n        else:\n            buf.append(a)\n        buf.append('</span>')\n        return _add_subclass_info(u''.join(buf), obj, (bytes, text_type))\n\n    def dict_repr(self, d, recursive, limit=5):\n        if recursive:\n            return _add_subclass_info(u'{...}', d, dict)\n        buf = ['{']\n        have_extended_section = False\n        for idx, (key, value) in enumerate(iteritems(d)):\n            if idx:\n                buf.append(', ')\n            if idx == limit - 1:\n                buf.append('<span class=\"extended\">')\n                have_extended_section = True\n            buf.append('<span class=\"pair\"><span class=\"key\">%s</span>: '\n                       '<span class=\"value\">%s</span></span>' %\n                       (self.repr(key), self.repr(value)))\n        if have_extended_section:\n            buf.append('</span>')\n        buf.append('}')\n        return _add_subclass_info(u''.join(buf), d, dict)\n\n    def object_repr(self, obj):\n        r = repr(obj)\n        if PY2:\n            r = r.decode('utf-8', 'replace')\n        return u'<span class=\"object\">%s</span>' % escape(r)\n\n    def dispatch_repr(self, obj, recursive):\n        if obj is helper:\n            return u'<span class=\"help\">%r</span>' % helper\n        if isinstance(obj, (integer_types, float, complex)):\n            return u'<span class=\"number\">%r</span>' % obj\n        if isinstance(obj, string_types):\n            return self.string_repr(obj)\n        if isinstance(obj, RegexType):\n            return self.regex_repr(obj)\n        if isinstance(obj, list):\n            return self.list_repr(obj, recursive)\n        if isinstance(obj, tuple):\n            return self.tuple_repr(obj, recursive)\n        if isinstance(obj, set):\n            return self.set_repr(obj, recursive)\n        if isinstance(obj, frozenset):\n            return self.frozenset_repr(obj, recursive)\n        if isinstance(obj, dict):\n            return self.dict_repr(obj, recursive)\n        if deque is not None and isinstance(obj, deque):\n            return self.deque_repr(obj, recursive)\n        return self.object_repr(obj)\n\n    def fallback_repr(self):\n        try:\n            info = ''.join(format_exception_only(*sys.exc_info()[:2]))\n        except Exception:  # pragma: no cover\n            info = '?'\n        if PY2:\n            info = info.decode('utf-8', 'ignore')\n        return u'<span class=\"brokenrepr\">&lt;broken repr (%s)&gt;' \\\n               u'</span>' % escape(info.strip())\n\n    def repr(self, obj):\n        recursive = False\n        for item in self._stack:\n            if item is obj:\n                recursive = True\n                break\n        self._stack.append(obj)\n        try:\n            try:\n                return self.dispatch_repr(obj, recursive)\n            except Exception:\n                return self.fallback_repr()\n        finally:\n            self._stack.pop()\n\n    def dump_object(self, obj):\n        repr = items = None\n        if isinstance(obj, dict):\n            title = 'Contents of'\n            items = []\n            for key, value in iteritems(obj):\n                if not isinstance(key, string_types):\n                    items = None\n                    break\n                items.append((key, self.repr(value)))\n        if items is None:\n            items = []\n            repr = self.repr(obj)\n            for key in dir(obj):\n                try:\n                    items.append((key, self.repr(getattr(obj, key))))\n                except Exception:\n                    pass\n            title = 'Details for'\n        title += ' ' + object.__repr__(obj)[1:-1]\n        return self.render_object_dump(items, title, repr)\n\n    def dump_locals(self, d):\n        items = [(key, self.repr(value)) for key, value in d.items()]\n        return self.render_object_dump(items, 'Local variables in frame')\n\n    def render_object_dump(self, items, title, repr=None):\n        html_items = []\n        for key, value in items:\n            html_items.append('<tr><th>%s<td><pre class=repr>%s</pre>' %\n                              (escape(key), value))\n        if not html_items:\n            html_items.append('<tr><td><em>Nothing</em>')\n        return OBJECT_DUMP_HTML % {\n            'title':    escape(title),\n            'repr':     repr and '<pre class=repr>%s</pre>' % repr or '',\n            'items':    '\\n'.join(html_items)\n        }\n"
  },
  {
    "path": "lib/werkzeug/debug/shared/FONT_LICENSE",
    "content": "-------------------------------\nUBUNTU FONT LICENCE Version 1.0\n-------------------------------\n\nPREAMBLE\nThis licence allows the licensed fonts to be used, studied, modified and\nredistributed freely. The fonts, including any derivative works, can be\nbundled, embedded, and redistributed provided the terms of this licence\nare met. The fonts and derivatives, however, cannot be released under\nany other licence. The requirement for fonts to remain under this\nlicence does not require any document created using the fonts or their\nderivatives to be published under this licence, as long as the primary\npurpose of the document is not to be a vehicle for the distribution of\nthe fonts.\n\nDEFINITIONS\n\"Font Software\" refers to the set of files released by the Copyright\nHolder(s) under this licence and clearly marked as such. This may\ninclude source files, build scripts and documentation.\n\n\"Original Version\" refers to the collection of Font Software components\nas received under this licence.\n\n\"Modified Version\" refers to any derivative made by adding to, deleting,\nor substituting -- in part or in whole -- any of the components of the\nOriginal Version, by changing formats or by porting the Font Software to\na new environment.\n\n\"Copyright Holder(s)\" refers to all individuals and companies who have a\ncopyright ownership of the Font Software.\n\n\"Substantially Changed\" refers to Modified Versions which can be easily\nidentified as dissimilar to the Font Software by users of the Font\nSoftware comparing the Original Version with the Modified Version.\n\nTo \"Propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy. Propagation includes copying,\ndistribution (with or without modification and with or without charging\na redistribution fee), making available to the public, and in some\ncountries other activities as well.\n\nPERMISSION & CONDITIONS\nThis licence does not grant any rights under trademark law and all such\nrights are reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a\ncopy of the Font Software, to propagate the Font Software, subject to\nthe below conditions:\n\n1) Each copy of the Font Software must contain the above copyright\nnotice and this licence. These can be included either as stand-alone\ntext files, human-readable headers or in the appropriate machine-\nreadable metadata fields within text or binary files as long as those\nfields can be easily viewed by the user.\n\n2) The font name complies with the following:\n(a) The Original Version must retain its name, unmodified.\n(b) Modified Versions which are Substantially Changed must be renamed to\navoid use of the name of the Original Version or similar names entirely.\n(c) Modified Versions which are not Substantially Changed must be\nrenamed to both (i) retain the name of the Original Version and (ii) add\nadditional naming elements to distinguish the Modified Version from the\nOriginal Version. The name of such Modified Versions must be the name of\nthe Original Version, with \"derivative X\" where X represents the name of\nthe new work, appended to that name.\n\n3) The name(s) of the Copyright Holder(s) and any contributor to the\nFont Software shall not be used to promote, endorse or advertise any\nModified Version, except (i) as required by this licence, (ii) to\nacknowledge the contribution(s) of the Copyright Holder(s) or (iii) with\ntheir explicit written permission.\n\n4) The Font Software, modified or unmodified, in part or in whole, must\nbe distributed entirely under this licence, and must not be distributed\nunder any other licence. The requirement for fonts to remain under this\nlicence does not affect any document created using the Font Software,\nexcept any version of the Font Software extracted from a document\ncreated using the Font Software may only be distributed under this\nlicence.\n\nTERMINATION\nThis licence becomes null and void if any of the above conditions are\nnot met.\n\nDISCLAIMER\nTHE FONT SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF\nCOPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE\nCOPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nINCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL\nDAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER\nDEALINGS IN THE FONT SOFTWARE.\n"
  },
  {
    "path": "lib/werkzeug/debug/shared/debugger.js",
    "content": "$(function() {\n  if (!EVALEX_TRUSTED) {\n    initPinBox();\n  }\n\n  /**\n   * if we are in console mode, show the console.\n   */\n  if (CONSOLE_MODE && EVALEX) {\n    openShell(null, $('div.console div.inner').empty(), 0);\n  }\n\n  $('div.traceback div.frame').each(function() {\n    var\n      target = $('pre', this),\n      consoleNode = null,\n      frameID = this.id.substring(6);\n\n    target.click(function() {\n      $(this).parent().toggleClass('expanded');\n    });\n\n    /**\n     * Add an interactive console to the frames\n     */\n    if (EVALEX && target.is('.current')) {\n      $('<img src=\"?__debugger__=yes&cmd=resource&f=console.png\">')\n        .attr('title', 'Open an interactive python shell in this frame')\n        .click(function() {\n          consoleNode = openShell(consoleNode, target, frameID);\n          return false;\n        })\n        .prependTo(target);\n    }\n  });\n\n  /**\n   * toggle traceback types on click.\n   */\n  $('h2.traceback').click(function() {\n    $(this).next().slideToggle('fast');\n    $('div.plain').slideToggle('fast');\n  }).css('cursor', 'pointer');\n  $('div.plain').hide();\n\n  /**\n   * Add extra info (this is here so that only users with JavaScript\n   * enabled see it.)\n   */\n  $('span.nojavascript')\n    .removeClass('nojavascript')\n    .html('<p>To switch between the interactive traceback and the plaintext ' +\n          'one, you can click on the \"Traceback\" headline.  From the text ' +\n          'traceback you can also create a paste of it. ' + (!EVALEX ? '' :\n          'For code execution mouse-over the frame you want to debug and ' +\n          'click on the console icon on the right side.' +\n          '<p>You can execute arbitrary Python code in the stack frames and ' +\n          'there are some extra helpers available for introspection:' +\n          '<ul><li><code>dump()</code> shows all variables in the frame' +\n          '<li><code>dump(obj)</code> dumps all that\\'s known about the object</ul>'));\n\n  /**\n   * Add the pastebin feature\n   */\n  $('div.plain form')\n    .submit(function() {\n      var label = $('input[type=\"submit\"]', this);\n      var old_val = label.val();\n      label.val('submitting...');\n      $.ajax({\n        dataType:     'json',\n        url:          document.location.pathname,\n        data:         {__debugger__: 'yes', tb: TRACEBACK, cmd: 'paste',\n                       s: SECRET},\n        success:      function(data) {\n          $('div.plain span.pastemessage')\n            .removeClass('pastemessage')\n            .text('Paste created: ')\n            .append($('<a>#' + data.id + '</a>').attr('href', data.url));\n        },\n        error:        function() {\n          alert('Error: Could not submit paste.  No network connection?');\n          label.val(old_val);\n        }\n      });\n      return false;\n    });\n\n  // if we have javascript we submit by ajax anyways, so no need for the\n  // not scaling textarea.\n  var plainTraceback = $('div.plain textarea');\n  plainTraceback.replaceWith($('<pre>').text(plainTraceback.text()));\n});\n\nfunction initPinBox() {\n  $('.pin-prompt form').submit(function(evt) {\n    evt.preventDefault();\n    var pin = this.pin.value;\n    var btn = this.btn;\n    btn.disabled = true;\n    $.ajax({\n      dataType: 'json',\n      url: document.location.pathname,\n      data: {__debugger__: 'yes', cmd: 'pinauth', pin: pin,\n             s: SECRET},\n      success: function(data) {\n        btn.disabled = false;\n        if (data.auth) {\n          EVALEX_TRUSTED = true;\n          $('.pin-prompt').fadeOut();\n        } else {\n          if (data.exhausted) {\n            alert('Error: too many attempts.  Restart server to retry.');\n          } else {\n            alert('Error: incorrect pin');\n          }\n        }\n        console.log(data);\n      },\n      error: function() {\n        btn.disabled = false;\n        alert('Error: Could not verify PIN.  Network error?');\n      }\n    });\n  });\n}\n\nfunction promptForPin() {\n  if (!EVALEX_TRUSTED) {\n    $.ajax({\n      url: document.location.pathname,\n      data: {__debugger__: 'yes', cmd: 'printpin', s: SECRET}\n    });\n    $('.pin-prompt').fadeIn(function() {\n      $('.pin-prompt input[name=\"pin\"]').focus();\n    });\n  }\n}\n\n\n/**\n * Helper function for shell initialization\n */\nfunction openShell(consoleNode, target, frameID) {\n  promptForPin();\n  if (consoleNode)\n    return consoleNode.slideToggle('fast');\n  consoleNode = $('<pre class=\"console\">')\n    .appendTo(target.parent())\n    .hide()\n  var historyPos = 0, history = [''];\n  var output = $('<div class=\"output\">[console ready]</div>')\n    .appendTo(consoleNode);\n  var form = $('<form>&gt;&gt;&gt; </form>')\n    .submit(function() {\n      var cmd = command.val();\n      $.get('', {\n          __debugger__: 'yes', cmd: cmd, frm: frameID, s: SECRET}, function(data) {\n        var tmp = $('<div>').html(data);\n        $('span.extended', tmp).each(function() {\n          var hidden = $(this).wrap('<span>').hide();\n          hidden\n            .parent()\n            .append($('<a href=\"#\" class=\"toggle\">&nbsp;&nbsp;</a>')\n              .click(function() {\n                hidden.toggle();\n                $(this).toggleClass('open')\n                return false;\n              }));\n        });\n        output.append(tmp);\n        command.focus();\n        consoleNode.scrollTop(consoleNode.get(0).scrollHeight);\n        var old = history.pop();\n        history.push(cmd);\n        if (typeof old != 'undefined')\n          history.push(old);\n        historyPos = history.length - 1;\n      });\n      command.val('');\n      return false;\n    }).\n    appendTo(consoleNode);\n\n  var command = $('<input type=\"text\">')\n    .appendTo(form)\n    .keydown(function(e) {\n      if (e.charCode == 100 && e.ctrlKey) {\n        output.text('--- screen cleared ---');\n        return false;\n      }\n      else if (e.charCode == 0 && (e.keyCode == 38 || e.keyCode == 40)) {\n        if (e.keyCode == 38 && historyPos > 0)\n          historyPos--;\n        else if (e.keyCode == 40 && historyPos < history.length)\n          historyPos++;\n        command.val(history[historyPos]);\n        return false;\n      }\n    });\n\n  return consoleNode.slideDown('fast', function() {\n    command.focus();\n  });\n}\n"
  },
  {
    "path": "lib/werkzeug/debug/shared/jquery.js",
    "content": "/*! jQuery v1.11.3 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */\n!function(a,b){\"object\"==typeof module&&\"object\"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error(\"jQuery requires a window with a document\");return b(a)}:b(a)}(\"undefined\"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=\"1.11.3\",m=function(a,b){return new m.fn.init(a,b)},n=/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,o=/^-ms-/,p=/-([\\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:\"\",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for(\"boolean\"==typeof g&&(j=g,g=arguments[h]||{},h++),\"object\"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:\"jQuery\"+(l+Math.random()).replace(/\\D/g,\"\"),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return\"function\"===m.type(a)},isArray:Array.isArray||function(a){return\"array\"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||\"object\"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,\"constructor\")&&!j.call(a.constructor.prototype,\"isPrototypeOf\"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+\"\":\"object\"==typeof a||\"function\"==typeof a?h[i.call(a)]||\"object\":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,\"ms-\").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?\"\":(a+\"\").replace(n,\"\")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,\"string\"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return\"string\"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each(\"Boolean Number String Function Array Date RegExp Object Error\".split(\" \"),function(a,b){h[\"[object \"+b+\"]\"]=b.toLowerCase()});function r(a){var b=\"length\"in a&&a.length,c=m.type(a);return\"function\"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:\"array\"===c||0===b||\"number\"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u=\"sizzle\"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K=\"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",L=\"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",M=\"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",N=M.replace(\"w\",\"w#\"),O=\"\\\\[\"+L+\"*(\"+M+\")(?:\"+L+\"*([*^$|!~]?=)\"+L+\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\"+N+\"))|)\"+L+\"*\\\\]\",P=\":(\"+M+\")(?:\\\\((('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\"+O+\")*)|.*)\\\\)|)\",Q=new RegExp(L+\"+\",\"g\"),R=new RegExp(\"^\"+L+\"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\"+L+\"+$\",\"g\"),S=new RegExp(\"^\"+L+\"*,\"+L+\"*\"),T=new RegExp(\"^\"+L+\"*([>+~]|\"+L+\")\"+L+\"*\"),U=new RegExp(\"=\"+L+\"*([^\\\\]'\\\"]*?)\"+L+\"*\\\\]\",\"g\"),V=new RegExp(P),W=new RegExp(\"^\"+N+\"$\"),X={ID:new RegExp(\"^#(\"+M+\")\"),CLASS:new RegExp(\"^\\\\.(\"+M+\")\"),TAG:new RegExp(\"^(\"+M.replace(\"w\",\"w*\")+\")\"),ATTR:new RegExp(\"^\"+O),PSEUDO:new RegExp(\"^\"+P),CHILD:new RegExp(\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\"+L+\"*(even|odd|(([+-]|)(\\\\d*)n|)\"+L+\"*(?:([+-]|)\"+L+\"*(\\\\d+)|))\"+L+\"*\\\\)|)\",\"i\"),bool:new RegExp(\"^(?:\"+K+\")$\",\"i\"),needsContext:new RegExp(\"^\"+L+\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\"+L+\"*((?:-\\\\d)?\\\\d*)\"+L+\"*\\\\)|)(?=[^-]|$)\",\"i\")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\\d$/i,$=/^[^{]+\\{\\s*\\[native \\w/,_=/^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,aa=/[+~]/,ba=/'|\\\\/g,ca=new RegExp(\"\\\\\\\\([\\\\da-f]{1,6}\"+L+\"?|(\"+L+\")|.)\",\"ig\"),da=function(a,b,c){var d=\"0x\"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,\"string\"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&\"object\"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute(\"id\"))?s=r.replace(ba,\"\\\\$&\"):b.setAttribute(\"id\",s),s=\"[id='\"+s+\"'] \",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(\",\")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute(\"id\")}}}return i(a.replace(R,\"$1\"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+\" \")>d.cacheLength&&delete b[a.shift()],b[c+\" \"]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement(\"div\");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split(\"|\"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return\"input\"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return(\"input\"===c||\"button\"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&\"undefined\"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?\"HTML\"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener(\"unload\",ea,!1):e.attachEvent&&e.attachEvent(\"onunload\",ea)),p=!f(g),c.attributes=ja(function(a){return a.className=\"i\",!a.getAttribute(\"className\")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment(\"\")),!a.getElementsByTagName(\"*\").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(\"undefined\"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute(\"id\")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c=\"undefined\"!=typeof a.getAttributeNode&&a.getAttributeNode(\"id\");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return\"undefined\"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if(\"*\"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML=\"<a id='\"+u+\"'></a><select id='\"+u+\"-\\f]' msallowcapture=''><option selected=''></option></select>\",a.querySelectorAll(\"[msallowcapture^='']\").length&&q.push(\"[*^$]=\"+L+\"*(?:''|\\\"\\\")\"),a.querySelectorAll(\"[selected]\").length||q.push(\"\\\\[\"+L+\"*(?:value|\"+K+\")\"),a.querySelectorAll(\"[id~=\"+u+\"-]\").length||q.push(\"~=\"),a.querySelectorAll(\":checked\").length||q.push(\":checked\"),a.querySelectorAll(\"a#\"+u+\"+*\").length||q.push(\".#.+[+~]\")}),ja(function(a){var b=g.createElement(\"input\");b.setAttribute(\"type\",\"hidden\"),a.appendChild(b).setAttribute(\"name\",\"D\"),a.querySelectorAll(\"[name=d]\").length&&q.push(\"name\"+L+\"*[*^$|!~]?=\"),a.querySelectorAll(\":enabled\").length||q.push(\":enabled\",\":disabled\"),a.querySelectorAll(\"*,:x\"),q.push(\",.*:\")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,\"div\"),s.call(a,\"[s!='']:x\"),r.push(\"!=\",P)}),q=q.length&&new RegExp(q.join(\"|\")),r=r.length&&new RegExp(r.join(\"|\")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,\"='$1']\"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error(\"Syntax error, unrecognized expression: \"+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c=\"\",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if(\"string\"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{\">\":{dir:\"parentNode\",first:!0},\" \":{dir:\"parentNode\"},\"+\":{dir:\"previousSibling\",first:!0},\"~\":{dir:\"previousSibling\"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||\"\").replace(ca,da),\"~=\"===a[2]&&(a[3]=\" \"+a[3]+\" \"),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),\"nth\"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*(\"even\"===a[3]||\"odd\"===a[3])),a[5]=+(a[7]+a[8]||\"odd\"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||\"\":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(\")\",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return\"*\"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+\" \"];return b||(b=new RegExp(\"(^|\"+L+\")\"+a+\"(\"+L+\"|$)\"))&&y(a,function(a){return b.test(\"string\"==typeof a.className&&a.className||\"undefined\"!=typeof a.getAttribute&&a.getAttribute(\"class\")||\"\")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?\"!=\"===b:b?(e+=\"\",\"=\"===b?e===c:\"!=\"===b?e!==c:\"^=\"===b?c&&0===e.indexOf(c):\"*=\"===b?c&&e.indexOf(c)>-1:\"$=\"===b?c&&e.slice(-c.length)===c:\"~=\"===b?(\" \"+e.replace(Q,\" \")+\" \").indexOf(c)>-1:\"|=\"===b?e===c||e.slice(0,c.length+1)===c+\"-\":!1):!0}},CHILD:function(a,b,c,d,e){var f=\"nth\"!==a.slice(0,3),g=\"last\"!==a.slice(-4),h=\"of-type\"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?\"nextSibling\":\"previousSibling\",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p=\"only\"===a&&!o&&\"nextSibling\"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error(\"unsupported pseudo: \"+a);return e[u]?e(b):e.length>1?(c=[a,a,\"\",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,\"$1\"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||\"\")||ga.error(\"unsupported lang: \"+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute(\"xml:lang\")||b.getAttribute(\"lang\"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+\"-\");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return\"input\"===b&&!!a.checked||\"option\"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return\"input\"===b&&\"button\"===a.type||\"button\"===b},text:function(a){var b;return\"input\"===a.nodeName.toLowerCase()&&\"text\"===a.type&&(null==(b=a.getAttribute(\"type\"))||\"text\"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function qa(){}qa.prototype=d.filters=d.pseudos,d.setFilters=new qa,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+\" \"];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R,\" \")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function ra(a){for(var b=0,c=a.length,d=\"\";c>b;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&\"parentNode\"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||\"*\",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[\" \"],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:\" \"===a[i-2].type?\"*\":\"\"})).replace(R,\"$1\"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q=\"0\",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG(\"*\",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+\" \"];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n=\"function\"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&\"ID\"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split(\"\").sort(B).join(\"\")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement(\"div\"))}),ja(function(a){return a.innerHTML=\"<a href='#'></a>\",\"#\"===a.firstChild.getAttribute(\"href\")})||ka(\"type|href|height|width\",function(a,b,c){return c?void 0:a.getAttribute(b,\"type\"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML=\"<input/>\",a.firstChild.setAttribute(\"value\",\"\"),\"\"===a.firstChild.getAttribute(\"value\")})||ka(\"value\",function(a,b,c){return c||\"input\"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute(\"disabled\")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);m.find=s,m.expr=s.selectors,m.expr[\":\"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/,v=/^.[^:#\\[\\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if(\"string\"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=\":not(\"+a+\")\"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if(\"string\"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+\" \"+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,\"string\"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if(\"string\"==typeof a){if(c=\"<\"===a.charAt(0)&&\">\"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?\"undefined\"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||\"string\"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?\"string\"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,\"parentNode\")},parentsUntil:function(a,b,c){return m.dir(a,\"parentNode\",c)},next:function(a){return D(a,\"nextSibling\")},prev:function(a){return D(a,\"previousSibling\")},nextAll:function(a){return m.dir(a,\"nextSibling\")},prevAll:function(a){return m.dir(a,\"previousSibling\")},nextUntil:function(a,b,c){return m.dir(a,\"nextSibling\",c)},prevUntil:function(a,b,c){return m.dir(a,\"previousSibling\",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,\"iframe\")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return\"Until\"!==a.slice(-5)&&(d=c),d&&\"string\"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a=\"string\"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);\"function\"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&\"string\"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[[\"resolve\",\"done\",m.Callbacks(\"once memory\"),\"resolved\"],[\"reject\",\"fail\",m.Callbacks(\"once memory\"),\"rejected\"],[\"notify\",\"progress\",m.Callbacks(\"memory\")]],c=\"pending\",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+\"With\"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+\"With\"](this===e?d:this,arguments),this},e[f[0]+\"With\"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler(\"ready\"),m(y).off(\"ready\")))}}});function I(){y.addEventListener?(y.removeEventListener(\"DOMContentLoaded\",J,!1),a.removeEventListener(\"load\",J,!1)):(y.detachEvent(\"onreadystatechange\",J),a.detachEvent(\"onload\",J))}function J(){(y.addEventListener||\"load\"===event.type||\"complete\"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),\"complete\"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener(\"DOMContentLoaded\",J,!1),a.addEventListener(\"load\",J,!1);else{y.attachEvent(\"onreadystatechange\",J),a.attachEvent(\"onload\",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll(\"left\")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K=\"undefined\",L;for(L in m(k))break;k.ownLast=\"0\"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName(\"body\")[0],c&&c.style&&(b=y.createElement(\"div\"),d=y.createElement(\"div\"),d.style.cssText=\"position:absolute;border:0;width:0;height:0;top:0;left:-9999px\",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText=\"display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1\",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement(\"div\");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+\" \").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute(\"classid\")===b};var M=/^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d=\"data-\"+b.replace(N,\"-$1\").toLowerCase();if(c=a.getAttribute(d),\"string\"==typeof c){try{c=\"true\"===c?!0:\"false\"===c?!1:\"null\"===c?null:+c+\"\"===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if((\"data\"!==b||!m.isEmptyObject(a[b]))&&\"toJSON\"!==b)return!1;\n\nreturn!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||\"string\"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),(\"object\"==typeof b||\"function\"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),\"string\"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(\" \")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{\"applet \":!0,\"embed \":!0,\"object \":\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,\"parsedAttrs\"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf(\"data-\")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,\"parsedAttrs\",!0)}return e}return\"object\"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||\"fx\")+\"queue\",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||\"fx\";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};\"inprogress\"===e&&(e=c.shift(),d--),e&&(\"fx\"===b&&c.unshift(\"inprogress\"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+\"queueHooks\";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks(\"once memory\").add(function(){m._removeData(a,b+\"queue\"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return\"string\"!=typeof a&&(b=a,a=\"fx\",c--),arguments.length<c?m.queue(this[0],a):void 0===b?this:this.each(function(){var c=m.queue(this,a,b);m._queueHooks(this,a),\"fx\"===a&&\"inprogress\"!==c[0]&&m.dequeue(this,a)})},dequeue:function(a){return this.each(function(){m.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||\"fx\",[])},promise:function(a,b){var c,d=1,e=m.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};\"string\"!=typeof a&&(b=a,a=void 0),a=a||\"fx\";while(g--)c=m._data(f[g],a+\"queueHooks\"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var S=/[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source,T=[\"Top\",\"Right\",\"Bottom\",\"Left\"],U=function(a,b){return a=b||a,\"none\"===m.css(a,\"display\")||!m.contains(a.ownerDocument,a)},V=m.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if(\"object\"===m.type(c)){e=!0;for(h in c)m.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,m.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(m(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement(\"input\"),b=y.createElement(\"div\"),c=y.createDocumentFragment();if(b.innerHTML=\"  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>\",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName(\"tbody\").length,k.htmlSerialize=!!b.getElementsByTagName(\"link\").length,k.html5Clone=\"<:nav></:nav>\"!==y.createElement(\"nav\").cloneNode(!0).outerHTML,a.type=\"checkbox\",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML=\"<textarea>x</textarea>\",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML=\"<input type='radio' checked='checked' name='t'/>\",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent(\"onclick\",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement(\"div\");for(b in{submit:!0,change:!0,focusin:!0})c=\"on\"+b,(k[b+\"Bubbles\"]=c in a)||(d.setAttribute(c,\"t\"),k[b+\"Bubbles\"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\\.(.+)|)$/;function aa(){return!0}function ba(){return!1}function ca(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||\"\").match(E)||[\"\"],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||\"\").split(\".\").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(\".\")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent(\"on\"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||\"\").match(E)||[\"\"],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||\"\").split(\".\").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp(\"(^|\\\\.)\"+p.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&(\"**\"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,\"events\"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,\"type\")?b.type:b,q=j.call(b,\"namespace\")?b.namespace.split(\".\"):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(\".\")>=0&&(q=p.split(\".\"),p=q.shift(),q.sort()),g=p.indexOf(\":\")<0&&\"on\"+p,b=b[m.expando]?b:new m.Event(p,\"object\"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join(\".\"),b.namespace_re=b.namespace?new RegExp(\"(^|\\\\.)\"+q.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,\"events\")||{})[b.type]&&m._data(h,\"handle\"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,\"events\")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||\"click\"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||\"click\"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+\" \",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[m.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=Z.test(e)?this.mouseHooks:Y.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new m.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||y),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},props:\"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),fixHooks:{},keyHooks:{props:\"char charCode key keyCode\".split(\" \"),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:\"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),filter:function(a,b){var c,d,e,f=b.button,g=b.fromElement;return null==a.pageX&&null!=b.clientX&&(d=a.target.ownerDocument||y,e=d.documentElement,c=d.body,a.pageX=b.clientX+(e&&e.scrollLeft||c&&c.scrollLeft||0)-(e&&e.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||c&&c.scrollTop||0)-(e&&e.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&g&&(a.relatedTarget=g===a.target?b.toElement:g),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==ca()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:\"focusin\"},blur:{trigger:function(){return this===ca()&&this.blur?(this.blur(),!1):void 0},delegateType:\"focusout\"},click:{trigger:function(){return m.nodeName(this,\"input\")&&\"checkbox\"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return m.nodeName(a.target,\"a\")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=m.extend(new m.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?m.event.trigger(e,null,b):m.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},m.removeEvent=y.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d=\"on\"+b;a.detachEvent&&(typeof a[d]===K&&(a[d]=null),a.detachEvent(d,c))},m.Event=function(a,b){return this instanceof m.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?aa:ba):this.type=a,b&&m.extend(this,b),this.timeStamp=a&&a.timeStamp||m.now(),void(this[m.expando]=!0)):new m.Event(a,b)},m.Event.prototype={isDefaultPrevented:ba,isPropagationStopped:ba,isImmediatePropagationStopped:ba,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=aa,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=aa,a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=aa,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},m.each({mouseenter:\"mouseover\",mouseleave:\"mouseout\",pointerenter:\"pointerover\",pointerleave:\"pointerout\"},function(a,b){m.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!m.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.submitBubbles||(m.event.special.submit={setup:function(){return m.nodeName(this,\"form\")?!1:void m.event.add(this,\"click._submit keypress._submit\",function(a){var b=a.target,c=m.nodeName(b,\"input\")||m.nodeName(b,\"button\")?b.form:void 0;c&&!m._data(c,\"submitBubbles\")&&(m.event.add(c,\"submit._submit\",function(a){a._submit_bubble=!0}),m._data(c,\"submitBubbles\",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&m.event.simulate(\"submit\",this.parentNode,a,!0))},teardown:function(){return m.nodeName(this,\"form\")?!1:void m.event.remove(this,\"._submit\")}}),k.changeBubbles||(m.event.special.change={setup:function(){return X.test(this.nodeName)?((\"checkbox\"===this.type||\"radio\"===this.type)&&(m.event.add(this,\"propertychange._change\",function(a){\"checked\"===a.originalEvent.propertyName&&(this._just_changed=!0)}),m.event.add(this,\"click._change\",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),m.event.simulate(\"change\",this,a,!0)})),!1):void m.event.add(this,\"beforeactivate._change\",function(a){var b=a.target;X.test(b.nodeName)&&!m._data(b,\"changeBubbles\")&&(m.event.add(b,\"change._change\",function(a){!this.parentNode||a.isSimulated||a.isTrigger||m.event.simulate(\"change\",this.parentNode,a,!0)}),m._data(b,\"changeBubbles\",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||\"radio\"!==b.type&&\"checkbox\"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return m.event.remove(this,\"._change\"),!X.test(this.nodeName)}}),k.focusinBubbles||m.each({focus:\"focusin\",blur:\"focusout\"},function(a,b){var c=function(a){m.event.simulate(b,a.target,m.event.fix(a),!0)};m.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=m._data(d,b);e||d.addEventListener(a,c,!0),m._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=m._data(d,b)-1;e?m._data(d,b,e):(d.removeEventListener(a,c,!0),m._removeData(d,b))}}}),m.fn.extend({on:function(a,b,c,d,e){var f,g;if(\"object\"==typeof a){\"string\"!=typeof b&&(c=c||b,b=void 0);for(f in a)this.on(f,b,c,a[f],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&(\"string\"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=ba;else if(!d)return this;return 1===e&&(g=d,d=function(a){return m().off(a),g.apply(this,arguments)},d.guid=g.guid||(g.guid=m.guid++)),this.each(function(){m.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,m(a.delegateTarget).off(d.namespace?d.origType+\".\"+d.namespace:d.origType,d.selector,d.handler),this;if(\"object\"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||\"function\"==typeof b)&&(c=b,b=void 0),c===!1&&(c=ba),this.each(function(){m.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){m.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?m.event.trigger(a,b,c,!0):void 0}});function da(a){var b=ea.split(\"|\"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}var ea=\"abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video\",fa=/ jQuery\\d+=\"(?:null|\\d+)\"/g,ga=new RegExp(\"<(?:\"+ea+\")[\\\\s/>]\",\"i\"),ha=/^\\s+/,ia=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/gi,ja=/<([\\w:]+)/,ka=/<tbody/i,la=/<|&#?\\w+;/,ma=/<(?:script|style|link)/i,na=/checked\\s*(?:[^=]|=\\s*.checked.)/i,oa=/^$|\\/(?:java|ecma)script/i,pa=/^true\\/(.*)/,qa=/^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g,ra={option:[1,\"<select multiple='multiple'>\",\"</select>\"],legend:[1,\"<fieldset>\",\"</fieldset>\"],area:[1,\"<map>\",\"</map>\"],param:[1,\"<object>\",\"</object>\"],thead:[1,\"<table>\",\"</table>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],col:[2,\"<table><tbody></tbody><colgroup>\",\"</colgroup></table>\"],td:[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],_default:k.htmlSerialize?[0,\"\",\"\"]:[1,\"X<div>\",\"</div>\"]},sa=da(y),ta=sa.appendChild(y.createElement(\"div\"));ra.optgroup=ra.option,ra.tbody=ra.tfoot=ra.colgroup=ra.caption=ra.thead,ra.th=ra.td;function ua(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||\"*\"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||\"*\"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ua(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function va(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wa(a,b){return m.nodeName(a,\"table\")&&m.nodeName(11!==b.nodeType?b:b.firstChild,\"tr\")?a.getElementsByTagName(\"tbody\")[0]||a.appendChild(a.ownerDocument.createElement(\"tbody\")):a}function xa(a){return a.type=(null!==m.find.attr(a,\"type\"))+\"/\"+a.type,a}function ya(a){var b=pa.exec(a.type);return b?a.type=b[1]:a.removeAttribute(\"type\"),a}function za(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,\"globalEval\",!b||m._data(b[d],\"globalEval\"))}function Aa(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Ba(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}\"script\"===c&&b.text!==a.text?(xa(b).text=a.text,ya(b)):\"object\"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):\"input\"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):\"option\"===c?b.defaultSelected=b.selected=a.defaultSelected:(\"input\"===c||\"textarea\"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!ga.test(\"<\"+a.nodeName+\">\")?f=a.cloneNode(!0):(ta.innerHTML=a.outerHTML,ta.removeChild(f=ta.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ua(f),h=ua(a),g=0;null!=(e=h[g]);++g)d[g]&&Ba(e,d[g]);if(b)if(c)for(h=h||ua(a),d=d||ua(f),g=0;null!=(e=h[g]);g++)Aa(e,d[g]);else Aa(a,f);return d=ua(f,\"script\"),d.length>0&&za(d,!i&&ua(a,\"script\")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=da(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if(\"object\"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(la.test(f)){h=h||o.appendChild(b.createElement(\"div\")),i=(ja.exec(f)||[\"\",\"\"])[1].toLowerCase(),l=ra[i]||ra._default,h.innerHTML=l[1]+f.replace(ia,\"<$1></$2>\")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&ha.test(f)&&p.push(b.createTextNode(ha.exec(f)[0])),!k.tbody){f=\"table\"!==i||ka.test(f)?\"<table>\"!==l[1]||ka.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],\"tbody\")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent=\"\";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ua(p,\"input\"),va),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ua(o.appendChild(f),\"script\"),g&&za(h),c)){e=0;while(f=h[e++])oa.test(f.type||\"\")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ua(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&za(ua(c,\"script\")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ua(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,\"select\")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fa,\"\"):void 0;if(!(\"string\"!=typeof a||ma.test(a)||!k.htmlSerialize&&ga.test(a)||!k.leadingWhitespace&&ha.test(a)||ra[(ja.exec(a)||[\"\",\"\"])[1].toLowerCase()])){a=a.replace(ia,\"<$1></$2>\");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ua(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ua(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&\"string\"==typeof p&&!k.checkClone&&na.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ua(i,\"script\"),xa),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ua(d,\"script\"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,ya),j=0;f>j;j++)d=g[j],oa.test(d.type||\"\")&&!m._data(d,\"globalEval\")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||\"\").replace(qa,\"\")));i=c=null}return this}}),m.each({appendTo:\"append\",prependTo:\"prepend\",insertBefore:\"before\",insertAfter:\"after\",replaceAll:\"replaceWith\"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Ca,Da={};function Ea(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],\"display\");return e.detach(),f}function Fa(a){var b=y,c=Da[a];return c||(c=Ea(a,b),\"none\"!==c&&c||(Ca=(Ca||m(\"<iframe frameborder='0' width='0' height='0'/>\")).appendTo(b.documentElement),b=(Ca[0].contentWindow||Ca[0].contentDocument).document,b.write(),b.close(),c=Ea(a,b),Ca.detach()),Da[a]=c),c}!function(){var a;k.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,d;return c=y.getElementsByTagName(\"body\")[0],c&&c.style?(b=y.createElement(\"div\"),d=y.createElement(\"div\"),d.style.cssText=\"position:absolute;border:0;width:0;height:0;top:0;left:-9999px\",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText=\"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1\",b.appendChild(y.createElement(\"div\")).style.width=\"5px\",a=3!==b.offsetWidth),c.removeChild(d),a):void 0}}();var Ga=/^margin/,Ha=new RegExp(\"^(\"+S+\")(?!px)[a-z%]+$\",\"i\"),Ia,Ja,Ka=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ia=function(b){return b.ownerDocument.defaultView.opener?b.ownerDocument.defaultView.getComputedStyle(b,null):a.getComputedStyle(b,null)},Ja=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ia(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(\"\"!==g||m.contains(a.ownerDocument,a)||(g=m.style(a,b)),Ha.test(g)&&Ga.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+\"\"}):y.documentElement.currentStyle&&(Ia=function(a){return a.currentStyle},Ja=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ia(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Ha.test(g)&&!Ka.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left=\"fontSize\"===b?\"1em\":g,g=h.pixelLeft+\"px\",h.left=d,f&&(e.left=f)),void 0===g?g:g+\"\"||\"auto\"});function La(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h;if(b=y.createElement(\"div\"),b.innerHTML=\"  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>\",d=b.getElementsByTagName(\"a\")[0],c=d&&d.style){c.cssText=\"float:left;opacity:.5\",k.opacity=\"0.5\"===c.opacity,k.cssFloat=!!c.cssFloat,b.style.backgroundClip=\"content-box\",b.cloneNode(!0).style.backgroundClip=\"\",k.clearCloneStyle=\"content-box\"===b.style.backgroundClip,k.boxSizing=\"\"===c.boxSizing||\"\"===c.MozBoxSizing||\"\"===c.WebkitBoxSizing,m.extend(k,{reliableHiddenOffsets:function(){return null==g&&i(),g},boxSizingReliable:function(){return null==f&&i(),f},pixelPosition:function(){return null==e&&i(),e},reliableMarginRight:function(){return null==h&&i(),h}});function i(){var b,c,d,i;c=y.getElementsByTagName(\"body\")[0],c&&c.style&&(b=y.createElement(\"div\"),d=y.createElement(\"div\"),d.style.cssText=\"position:absolute;border:0;width:0;height:0;top:0;left:-9999px\",c.appendChild(d).appendChild(b),b.style.cssText=\"-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute\",e=f=!1,h=!0,a.getComputedStyle&&(e=\"1%\"!==(a.getComputedStyle(b,null)||{}).top,f=\"4px\"===(a.getComputedStyle(b,null)||{width:\"4px\"}).width,i=b.appendChild(y.createElement(\"div\")),i.style.cssText=b.style.cssText=\"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0\",i.style.marginRight=i.style.width=\"0\",b.style.width=\"1px\",h=!parseFloat((a.getComputedStyle(i,null)||{}).marginRight),b.removeChild(i)),b.innerHTML=\"<table><tr><td></td><td>t</td></tr></table>\",i=b.getElementsByTagName(\"td\"),i[0].style.cssText=\"margin:0;border:0;padding:0;display:none\",g=0===i[0].offsetHeight,g&&(i[0].style.display=\"\",i[1].style.display=\"none\",g=0===i[0].offsetHeight),c.removeChild(d))}}}(),m.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Ma=/alpha\\([^)]*\\)/i,Na=/opacity\\s*=\\s*([^)]*)/,Oa=/^(none|table(?!-c[ea]).+)/,Pa=new RegExp(\"^(\"+S+\")(.*)$\",\"i\"),Qa=new RegExp(\"^([+-])=(\"+S+\")\",\"i\"),Ra={position:\"absolute\",visibility:\"hidden\",display:\"block\"},Sa={letterSpacing:\"0\",fontWeight:\"400\"},Ta=[\"Webkit\",\"O\",\"Moz\",\"ms\"];function Ua(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Ta.length;while(e--)if(b=Ta[e]+c,b in a)return b;return d}function Va(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=m._data(d,\"olddisplay\"),c=d.style.display,b?(f[g]||\"none\"!==c||(d.style.display=\"\"),\"\"===d.style.display&&U(d)&&(f[g]=m._data(d,\"olddisplay\",Fa(d.nodeName)))):(e=U(d),(c&&\"none\"!==c||!e)&&m._data(d,\"olddisplay\",e?c:m.css(d,\"display\"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&\"none\"!==d.style.display&&\"\"!==d.style.display||(d.style.display=b?f[g]||\"\":\"none\"));return a}function Wa(a,b,c){var d=Pa.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||\"px\"):b}function Xa(a,b,c,d,e){for(var f=c===(d?\"border\":\"content\")?4:\"width\"===b?1:0,g=0;4>f;f+=2)\"margin\"===c&&(g+=m.css(a,c+T[f],!0,e)),d?(\"content\"===c&&(g-=m.css(a,\"padding\"+T[f],!0,e)),\"margin\"!==c&&(g-=m.css(a,\"border\"+T[f]+\"Width\",!0,e))):(g+=m.css(a,\"padding\"+T[f],!0,e),\"padding\"!==c&&(g+=m.css(a,\"border\"+T[f]+\"Width\",!0,e)));return g}function Ya(a,b,c){var d=!0,e=\"width\"===b?a.offsetWidth:a.offsetHeight,f=Ia(a),g=k.boxSizing&&\"border-box\"===m.css(a,\"boxSizing\",!1,f);if(0>=e||null==e){if(e=Ja(a,b,f),(0>e||null==e)&&(e=a.style[b]),Ha.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Xa(a,b,c||(g?\"border\":\"content\"),d,f)+\"px\"}m.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Ja(a,\"opacity\");return\"\"===c?\"1\":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{\"float\":k.cssFloat?\"cssFloat\":\"styleFloat\"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=m.camelCase(b),i=a.style;if(b=m.cssProps[h]||(m.cssProps[h]=Ua(i,h)),g=m.cssHooks[b]||m.cssHooks[h],void 0===c)return g&&\"get\"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,\"string\"===f&&(e=Qa.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(m.css(a,b)),f=\"number\"),null!=c&&c===c&&(\"number\"!==f||m.cssNumber[h]||(c+=\"px\"),k.clearCloneStyle||\"\"!==c||0!==b.indexOf(\"background\")||(i[b]=\"inherit\"),!(g&&\"set\"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=m.camelCase(b);return b=m.cssProps[h]||(m.cssProps[h]=Ua(a.style,h)),g=m.cssHooks[b]||m.cssHooks[h],g&&\"get\"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Ja(a,b,d)),\"normal\"===f&&b in Sa&&(f=Sa[b]),\"\"===c||c?(e=parseFloat(f),c===!0||m.isNumeric(e)?e||0:f):f}}),m.each([\"height\",\"width\"],function(a,b){m.cssHooks[b]={get:function(a,c,d){return c?Oa.test(m.css(a,\"display\"))&&0===a.offsetWidth?m.swap(a,Ra,function(){return Ya(a,b,d)}):Ya(a,b,d):void 0},set:function(a,c,d){var e=d&&Ia(a);return Wa(a,c,d?Xa(a,b,d,k.boxSizing&&\"border-box\"===m.css(a,\"boxSizing\",!1,e),e):0)}}}),k.opacity||(m.cssHooks.opacity={get:function(a,b){return Na.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||\"\")?.01*parseFloat(RegExp.$1)+\"\":b?\"1\":\"\"},set:function(a,b){var c=a.style,d=a.currentStyle,e=m.isNumeric(b)?\"alpha(opacity=\"+100*b+\")\":\"\",f=d&&d.filter||c.filter||\"\";c.zoom=1,(b>=1||\"\"===b)&&\"\"===m.trim(f.replace(Ma,\"\"))&&c.removeAttribute&&(c.removeAttribute(\"filter\"),\"\"===b||d&&!d.filter)||(c.filter=Ma.test(f)?f.replace(Ma,e):f+\" \"+e)}}),m.cssHooks.marginRight=La(k.reliableMarginRight,function(a,b){return b?m.swap(a,{display:\"inline-block\"},Ja,[a,\"marginRight\"]):void 0}),m.each({margin:\"\",padding:\"\",border:\"Width\"},function(a,b){m.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f=\"string\"==typeof c?c.split(\" \"):[c];4>d;d++)e[a+T[d]+b]=f[d]||f[d-2]||f[0];return e}},Ga.test(a)||(m.cssHooks[a+b].set=Wa)}),m.fn.extend({css:function(a,b){return V(this,function(a,b,c){var d,e,f={},g=0;if(m.isArray(b)){for(d=Ia(a),e=b.length;e>g;g++)f[b[g]]=m.css(a,b[g],!1,d);return f}return void 0!==c?m.style(a,b,c):m.css(a,b)},a,b,arguments.length>1)},show:function(){return Va(this,!0)},hide:function(){return Va(this)},toggle:function(a){return\"boolean\"==typeof a?a?this.show():this.hide():this.each(function(){U(this)?m(this).show():m(this).hide()})}});function Za(a,b,c,d,e){\nreturn new Za.prototype.init(a,b,c,d,e)}m.Tween=Za,Za.prototype={constructor:Za,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||\"swing\",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(m.cssNumber[c]?\"\":\"px\")},cur:function(){var a=Za.propHooks[this.prop];return a&&a.get?a.get(this):Za.propHooks._default.get(this)},run:function(a){var b,c=Za.propHooks[this.prop];return this.options.duration?this.pos=b=m.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Za.propHooks._default.set(this),this}},Za.prototype.init.prototype=Za.prototype,Za.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=m.css(a.elem,a.prop,\"\"),b&&\"auto\"!==b?b:0):a.elem[a.prop]},set:function(a){m.fx.step[a.prop]?m.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[m.cssProps[a.prop]]||m.cssHooks[a.prop])?m.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Za.propHooks.scrollTop=Za.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},m.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},m.fx=Za.prototype.init,m.fx.step={};var $a,_a,ab=/^(?:toggle|show|hide)$/,bb=new RegExp(\"^(?:([+-])=|)(\"+S+\")([a-z%]*)$\",\"i\"),cb=/queueHooks$/,db=[ib],eb={\"*\":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=bb.exec(b),f=e&&e[3]||(m.cssNumber[a]?\"\":\"px\"),g=(m.cssNumber[a]||\"px\"!==f&&+d)&&bb.exec(m.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||\".5\",g/=h,m.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function fb(){return setTimeout(function(){$a=void 0}),$a=m.now()}function gb(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=T[e],d[\"margin\"+c]=d[\"padding\"+c]=a;return b&&(d.opacity=d.width=a),d}function hb(a,b,c){for(var d,e=(eb[b]||[]).concat(eb[\"*\"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ib(a,b,c){var d,e,f,g,h,i,j,l,n=this,o={},p=a.style,q=a.nodeType&&U(a),r=m._data(a,\"fxshow\");c.queue||(h=m._queueHooks(a,\"fx\"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,n.always(function(){n.always(function(){h.unqueued--,m.queue(a,\"fx\").length||h.empty.fire()})})),1===a.nodeType&&(\"height\"in b||\"width\"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=m.css(a,\"display\"),l=\"none\"===j?m._data(a,\"olddisplay\")||Fa(a.nodeName):j,\"inline\"===l&&\"none\"===m.css(a,\"float\")&&(k.inlineBlockNeedsLayout&&\"inline\"!==Fa(a.nodeName)?p.zoom=1:p.display=\"inline-block\")),c.overflow&&(p.overflow=\"hidden\",k.shrinkWrapBlocks()||n.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],ab.exec(e)){if(delete b[d],f=f||\"toggle\"===e,e===(q?\"hide\":\"show\")){if(\"show\"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||m.style(a,d)}else j=void 0;if(m.isEmptyObject(o))\"inline\"===(\"none\"===j?Fa(a.nodeName):j)&&(p.display=j);else{r?\"hidden\"in r&&(q=r.hidden):r=m._data(a,\"fxshow\",{}),f&&(r.hidden=!q),q?m(a).show():n.done(function(){m(a).hide()}),n.done(function(){var b;m._removeData(a,\"fxshow\");for(b in o)m.style(a,b,o[b])});for(d in o)g=hb(q?r[d]:0,d,n),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start=\"width\"===d||\"height\"===d?1:0))}}function jb(a,b){var c,d,e,f,g;for(c in a)if(d=m.camelCase(c),e=b[d],f=a[c],m.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=m.cssHooks[d],g&&\"expand\"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kb(a,b,c){var d,e,f=0,g=db.length,h=m.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=$a||fb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:m.extend({},b),opts:m.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:$a||fb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=m.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jb(k,j.opts.specialEasing);g>f;f++)if(d=db[f].call(j,a,k,j.opts))return d;return m.map(k,hb,j),m.isFunction(j.opts.start)&&j.opts.start.call(a,j),m.fx.timer(m.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}m.Animation=m.extend(kb,{tweener:function(a,b){m.isFunction(a)?(b=a,a=[\"*\"]):a=a.split(\" \");for(var c,d=0,e=a.length;e>d;d++)c=a[d],eb[c]=eb[c]||[],eb[c].unshift(b)},prefilter:function(a,b){b?db.unshift(a):db.push(a)}}),m.speed=function(a,b,c){var d=a&&\"object\"==typeof a?m.extend({},a):{complete:c||!c&&b||m.isFunction(a)&&a,duration:a,easing:c&&b||b&&!m.isFunction(b)&&b};return d.duration=m.fx.off?0:\"number\"==typeof d.duration?d.duration:d.duration in m.fx.speeds?m.fx.speeds[d.duration]:m.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue=\"fx\"),d.old=d.complete,d.complete=function(){m.isFunction(d.old)&&d.old.call(this),d.queue&&m.dequeue(this,d.queue)},d},m.fn.extend({fadeTo:function(a,b,c,d){return this.filter(U).css(\"opacity\",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=m.isEmptyObject(a),f=m.speed(b,c,d),g=function(){var b=kb(this,m.extend({},a),f);(e||m._data(this,\"finish\"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return\"string\"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||\"fx\",[]),this.each(function(){var b=!0,e=null!=a&&a+\"queueHooks\",f=m.timers,g=m._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&cb.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&m.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||\"fx\"),this.each(function(){var b,c=m._data(this),d=c[a+\"queue\"],e=c[a+\"queueHooks\"],f=m.timers,g=d?d.length:0;for(c.finish=!0,m.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),m.each([\"toggle\",\"show\",\"hide\"],function(a,b){var c=m.fn[b];m.fn[b]=function(a,d,e){return null==a||\"boolean\"==typeof a?c.apply(this,arguments):this.animate(gb(b,!0),a,d,e)}}),m.each({slideDown:gb(\"show\"),slideUp:gb(\"hide\"),slideToggle:gb(\"toggle\"),fadeIn:{opacity:\"show\"},fadeOut:{opacity:\"hide\"},fadeToggle:{opacity:\"toggle\"}},function(a,b){m.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),m.timers=[],m.fx.tick=function(){var a,b=m.timers,c=0;for($a=m.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||m.fx.stop(),$a=void 0},m.fx.timer=function(a){m.timers.push(a),a()?m.fx.start():m.timers.pop()},m.fx.interval=13,m.fx.start=function(){_a||(_a=setInterval(m.fx.tick,m.fx.interval))},m.fx.stop=function(){clearInterval(_a),_a=null},m.fx.speeds={slow:600,fast:200,_default:400},m.fn.delay=function(a,b){return a=m.fx?m.fx.speeds[a]||a:a,b=b||\"fx\",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a,b,c,d,e;b=y.createElement(\"div\"),b.setAttribute(\"className\",\"t\"),b.innerHTML=\"  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>\",d=b.getElementsByTagName(\"a\")[0],c=y.createElement(\"select\"),e=c.appendChild(y.createElement(\"option\")),a=b.getElementsByTagName(\"input\")[0],d.style.cssText=\"top:1px\",k.getSetAttribute=\"t\"!==b.className,k.style=/top/.test(d.getAttribute(\"style\")),k.hrefNormalized=\"/a\"===d.getAttribute(\"href\"),k.checkOn=!!a.value,k.optSelected=e.selected,k.enctype=!!y.createElement(\"form\").enctype,c.disabled=!0,k.optDisabled=!e.disabled,a=y.createElement(\"input\"),a.setAttribute(\"value\",\"\"),k.input=\"\"===a.getAttribute(\"value\"),a.value=\"t\",a.setAttribute(\"type\",\"radio\"),k.radioValue=\"t\"===a.value}();var lb=/\\r/g;m.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=m.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,m(this).val()):a,null==e?e=\"\":\"number\"==typeof e?e+=\"\":m.isArray(e)&&(e=m.map(e,function(a){return null==a?\"\":a+\"\"})),b=m.valHooks[this.type]||m.valHooks[this.nodeName.toLowerCase()],b&&\"set\"in b&&void 0!==b.set(this,e,\"value\")||(this.value=e))});if(e)return b=m.valHooks[e.type]||m.valHooks[e.nodeName.toLowerCase()],b&&\"get\"in b&&void 0!==(c=b.get(e,\"value\"))?c:(c=e.value,\"string\"==typeof c?c.replace(lb,\"\"):null==c?\"\":c)}}}),m.extend({valHooks:{option:{get:function(a){var b=m.find.attr(a,\"value\");return null!=b?b:m.trim(m.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f=\"select-one\"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute(\"disabled\"))||c.parentNode.disabled&&m.nodeName(c.parentNode,\"optgroup\"))){if(b=m(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=m.makeArray(b),g=e.length;while(g--)if(d=e[g],m.inArray(m.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),m.each([\"radio\",\"checkbox\"],function(){m.valHooks[this]={set:function(a,b){return m.isArray(b)?a.checked=m.inArray(m(a).val(),b)>=0:void 0}},k.checkOn||(m.valHooks[this].get=function(a){return null===a.getAttribute(\"value\")?\"on\":a.value})});var mb,nb,ob=m.expr.attrHandle,pb=/^(?:checked|selected)$/i,qb=k.getSetAttribute,rb=k.input;m.fn.extend({attr:function(a,b){return V(this,m.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){m.removeAttr(this,a)})}}),m.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===K?m.prop(a,b,c):(1===f&&m.isXMLDoc(a)||(b=b.toLowerCase(),d=m.attrHooks[b]||(m.expr.match.bool.test(b)?nb:mb)),void 0===c?d&&\"get\"in d&&null!==(e=d.get(a,b))?e:(e=m.find.attr(a,b),null==e?void 0:e):null!==c?d&&\"set\"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+\"\"),c):void m.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=m.propFix[c]||c,m.expr.match.bool.test(c)?rb&&qb||!pb.test(c)?a[d]=!1:a[m.camelCase(\"default-\"+c)]=a[d]=!1:m.attr(a,c,\"\"),a.removeAttribute(qb?c:d)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&\"radio\"===b&&m.nodeName(a,\"input\")){var c=a.value;return a.setAttribute(\"type\",b),c&&(a.value=c),b}}}}}),nb={set:function(a,b,c){return b===!1?m.removeAttr(a,c):rb&&qb||!pb.test(c)?a.setAttribute(!qb&&m.propFix[c]||c,c):a[m.camelCase(\"default-\"+c)]=a[c]=!0,c}},m.each(m.expr.match.bool.source.match(/\\w+/g),function(a,b){var c=ob[b]||m.find.attr;ob[b]=rb&&qb||!pb.test(b)?function(a,b,d){var e,f;return d||(f=ob[b],ob[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,ob[b]=f),e}:function(a,b,c){return c?void 0:a[m.camelCase(\"default-\"+b)]?b.toLowerCase():null}}),rb&&qb||(m.attrHooks.value={set:function(a,b,c){return m.nodeName(a,\"input\")?void(a.defaultValue=b):mb&&mb.set(a,b,c)}}),qb||(mb={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+=\"\",\"value\"===c||b===a.getAttribute(c)?b:void 0}},ob.id=ob.name=ob.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&\"\"!==d.value?d.value:null},m.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:mb.set},m.attrHooks.contenteditable={set:function(a,b,c){mb.set(a,\"\"===b?!1:b,c)}},m.each([\"width\",\"height\"],function(a,b){m.attrHooks[b]={set:function(a,c){return\"\"===c?(a.setAttribute(b,\"auto\"),c):void 0}}})),k.style||(m.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+\"\"}});var sb=/^(?:input|select|textarea|button|object)$/i,tb=/^(?:a|area)$/i;m.fn.extend({prop:function(a,b){return V(this,m.prop,a,b,arguments.length>1)},removeProp:function(a){return a=m.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),m.extend({propFix:{\"for\":\"htmlFor\",\"class\":\"className\"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!m.isXMLDoc(a),f&&(b=m.propFix[b]||b,e=m.propHooks[b]),void 0!==c?e&&\"set\"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&\"get\"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=m.find.attr(a,\"tabindex\");return b?parseInt(b,10):sb.test(a.nodeName)||tb.test(a.nodeName)&&a.href?0:-1}}}}),k.hrefNormalized||m.each([\"href\",\"src\"],function(a,b){m.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),k.optSelected||(m.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),m.each([\"tabIndex\",\"readOnly\",\"maxLength\",\"cellSpacing\",\"cellPadding\",\"rowSpan\",\"colSpan\",\"useMap\",\"frameBorder\",\"contentEditable\"],function(){m.propFix[this.toLowerCase()]=this}),k.enctype||(m.propFix.enctype=\"encoding\");var ub=/[\\t\\r\\n\\f]/g;m.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=\"string\"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||\"\").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(\" \"+c.className+\" \").replace(ub,\" \"):\" \")){f=0;while(e=b[f++])d.indexOf(\" \"+e+\" \")<0&&(d+=e+\" \");g=m.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||\"string\"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||\"\").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(\" \"+c.className+\" \").replace(ub,\" \"):\"\")){f=0;while(e=b[f++])while(d.indexOf(\" \"+e+\" \")>=0)d=d.replace(\" \"+e+\" \",\" \");g=a?m.trim(d):\"\",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return\"boolean\"==typeof b&&\"string\"===c?b?this.addClass(a):this.removeClass(a):this.each(m.isFunction(a)?function(c){m(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if(\"string\"===c){var b,d=0,e=m(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===K||\"boolean\"===c)&&(this.className&&m._data(this,\"__className__\",this.className),this.className=this.className||a===!1?\"\":m._data(this,\"__className__\")||\"\")})},hasClass:function(a){for(var b=\" \"+a+\" \",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(\" \"+this[c].className+\" \").replace(ub,\" \").indexOf(b)>=0)return!0;return!1}}),m.each(\"blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu\".split(\" \"),function(a,b){m.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),m.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,\"**\"):this.off(b,a||\"**\",c)}});var vb=m.now(),wb=/\\?/,xb=/(,)|(\\[|{)|(}|])|\"(?:[^\"\\\\\\r\\n]|\\\\[\"\\\\\\/bfnrt]|\\\\u[\\da-fA-F]{4})*\"\\s*:?|true|false|null|-?(?!0\\d)\\d+(?:\\.\\d+|)(?:[eE][+-]?\\d+|)/g;m.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+\"\");var c,d=null,e=m.trim(b+\"\");return e&&!m.trim(e.replace(xb,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,\"\")}))?Function(\"return \"+e)():m.error(\"Invalid JSON: \"+b)},m.parseXML=function(b){var c,d;if(!b||\"string\"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,\"text/xml\")):(c=new ActiveXObject(\"Microsoft.XMLDOM\"),c.async=\"false\",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName(\"parsererror\").length||m.error(\"Invalid XML: \"+b),c};var yb,zb,Ab=/#.*$/,Bb=/([?&])_=[^&]*/,Cb=/^(.*?):[ \\t]*([^\\r\\n]*)\\r?$/gm,Db=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Eb=/^(?:GET|HEAD)$/,Fb=/^\\/\\//,Gb=/^([\\w.+-]+:)(?:\\/\\/(?:[^\\/?#]*@|)([^\\/?#:]*)(?::(\\d+)|)|)/,Hb={},Ib={},Jb=\"*/\".concat(\"*\");try{zb=location.href}catch(Kb){zb=y.createElement(\"a\"),zb.href=\"\",zb=zb.href}yb=Gb.exec(zb.toLowerCase())||[];function Lb(a){return function(b,c){\"string\"!=typeof b&&(c=b,b=\"*\");var d,e=0,f=b.toLowerCase().match(E)||[];if(m.isFunction(c))while(d=f[e++])\"+\"===d.charAt(0)?(d=d.slice(1)||\"*\",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Mb(a,b,c,d){var e={},f=a===Ib;function g(h){var i;return e[h]=!0,m.each(a[h]||[],function(a,h){var j=h(b,c,d);return\"string\"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e[\"*\"]&&g(\"*\")}function Nb(a,b){var c,d,e=m.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&m.extend(!0,a,c),a}function Ob(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while(\"*\"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader(\"Content-Type\"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+\" \"+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Pb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if(\"*\"===f)f=i;else if(\"*\"!==i&&i!==f){if(g=j[i+\" \"+f]||j[\"* \"+f],!g)for(e in j)if(h=e.split(\" \"),h[1]===f&&(g=j[i+\" \"+h[0]]||j[\"* \"+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a[\"throws\"])b=g(b);else try{b=g(b)}catch(l){return{state:\"parsererror\",error:g?l:\"No conversion from \"+i+\" to \"+f}}}return{state:\"success\",data:b}}m.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:zb,type:\"GET\",isLocal:Db.test(yb[1]),global:!0,processData:!0,async:!0,contentType:\"application/x-www-form-urlencoded; charset=UTF-8\",accepts:{\"*\":Jb,text:\"text/plain\",html:\"text/html\",xml:\"application/xml, text/xml\",json:\"application/json, text/javascript\"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:\"responseXML\",text:\"responseText\",json:\"responseJSON\"},converters:{\"* text\":String,\"text html\":!0,\"text json\":m.parseJSON,\"text xml\":m.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Nb(Nb(a,m.ajaxSettings),b):Nb(m.ajaxSettings,a)},ajaxPrefilter:Lb(Hb),ajaxTransport:Lb(Ib),ajax:function(a,b){\"object\"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=m.ajaxSetup({},b),l=k.context||k,n=k.context&&(l.nodeType||l.jquery)?m(l):m.event,o=m.Deferred(),p=m.Callbacks(\"once memory\"),q=k.statusCode||{},r={},s={},t=0,u=\"canceled\",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Cb.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||zb)+\"\").replace(Ab,\"\").replace(Fb,yb[1]+\"//\"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=m.trim(k.dataType||\"*\").toLowerCase().match(E)||[\"\"],null==k.crossDomain&&(c=Gb.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===yb[1]&&c[2]===yb[2]&&(c[3]||(\"http:\"===c[1]?\"80\":\"443\"))===(yb[3]||(\"http:\"===yb[1]?\"80\":\"443\")))),k.data&&k.processData&&\"string\"!=typeof k.data&&(k.data=m.param(k.data,k.traditional)),Mb(Hb,k,b,v),2===t)return v;h=m.event&&k.global,h&&0===m.active++&&m.event.trigger(\"ajaxStart\"),k.type=k.type.toUpperCase(),k.hasContent=!Eb.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(wb.test(e)?\"&\":\"?\")+k.data,delete k.data),k.cache===!1&&(k.url=Bb.test(e)?e.replace(Bb,\"$1_=\"+vb++):e+(wb.test(e)?\"&\":\"?\")+\"_=\"+vb++)),k.ifModified&&(m.lastModified[e]&&v.setRequestHeader(\"If-Modified-Since\",m.lastModified[e]),m.etag[e]&&v.setRequestHeader(\"If-None-Match\",m.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader(\"Content-Type\",k.contentType),v.setRequestHeader(\"Accept\",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+(\"*\"!==k.dataTypes[0]?\", \"+Jb+\"; q=0.01\":\"\"):k.accepts[\"*\"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u=\"abort\";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Mb(Ib,k,b,v)){v.readyState=1,h&&n.trigger(\"ajaxSend\",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort(\"timeout\")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,\"No Transport\");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||\"\",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Ob(k,v,c)),u=Pb(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader(\"Last-Modified\"),w&&(m.lastModified[e]=w),w=v.getResponseHeader(\"etag\"),w&&(m.etag[e]=w)),204===a||\"HEAD\"===k.type?x=\"nocontent\":304===a?x=\"notmodified\":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x=\"error\",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+\"\",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&n.trigger(j?\"ajaxSuccess\":\"ajaxError\",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(n.trigger(\"ajaxComplete\",[v,k]),--m.active||m.event.trigger(\"ajaxStop\")))}return v},getJSON:function(a,b,c){return m.get(a,b,c,\"json\")},getScript:function(a,b){return m.get(a,void 0,b,\"script\")}}),m.each([\"get\",\"post\"],function(a,b){m[b]=function(a,c,d,e){return m.isFunction(c)&&(e=e||d,d=c,c=void 0),m.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),m._evalUrl=function(a){return m.ajax({url:a,type:\"GET\",dataType:\"script\",async:!1,global:!1,\"throws\":!0})},m.fn.extend({wrapAll:function(a){if(m.isFunction(a))return this.each(function(b){m(this).wrapAll(a.call(this,b))});if(this[0]){var b=m(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(m.isFunction(a)?function(b){m(this).wrapInner(a.call(this,b))}:function(){var b=m(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=m.isFunction(a);return this.each(function(c){m(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){m.nodeName(this,\"body\")||m(this).replaceWith(this.childNodes)}).end()}}),m.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!k.reliableHiddenOffsets()&&\"none\"===(a.style&&a.style.display||m.css(a,\"display\"))},m.expr.filters.visible=function(a){return!m.expr.filters.hidden(a)};var Qb=/%20/g,Rb=/\\[\\]$/,Sb=/\\r?\\n/g,Tb=/^(?:submit|button|image|reset|file)$/i,Ub=/^(?:input|select|textarea|keygen)/i;function Vb(a,b,c,d){var e;if(m.isArray(b))m.each(b,function(b,e){c||Rb.test(a)?d(a,e):Vb(a+\"[\"+(\"object\"==typeof e?b:\"\")+\"]\",e,c,d)});else if(c||\"object\"!==m.type(b))d(a,b);else for(e in b)Vb(a+\"[\"+e+\"]\",b[e],c,d)}m.param=function(a,b){var c,d=[],e=function(a,b){b=m.isFunction(b)?b():null==b?\"\":b,d[d.length]=encodeURIComponent(a)+\"=\"+encodeURIComponent(b)};if(void 0===b&&(b=m.ajaxSettings&&m.ajaxSettings.traditional),m.isArray(a)||a.jquery&&!m.isPlainObject(a))m.each(a,function(){e(this.name,this.value)});else for(c in a)Vb(c,a[c],b,e);return d.join(\"&\").replace(Qb,\"+\")},m.fn.extend({serialize:function(){return m.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=m.prop(this,\"elements\");return a?m.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!m(this).is(\":disabled\")&&Ub.test(this.nodeName)&&!Tb.test(a)&&(this.checked||!W.test(a))}).map(function(a,b){var c=m(this).val();return null==c?null:m.isArray(c)?m.map(c,function(a){return{name:b.name,value:a.replace(Sb,\"\\r\\n\")}}):{name:b.name,value:c.replace(Sb,\"\\r\\n\")}}).get()}}),m.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&Zb()||$b()}:Zb;var Wb=0,Xb={},Yb=m.ajaxSettings.xhr();a.attachEvent&&a.attachEvent(\"onunload\",function(){for(var a in Xb)Xb[a](void 0,!0)}),k.cors=!!Yb&&\"withCredentials\"in Yb,Yb=k.ajax=!!Yb,Yb&&m.ajaxTransport(function(a){if(!a.crossDomain||k.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Wb;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c[\"X-Requested-With\"]||(c[\"X-Requested-With\"]=\"XMLHttpRequest\");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+\"\");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Xb[g],b=void 0,f.onreadystatechange=m.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,\"string\"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=\"\"}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Xb[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function Zb(){try{return new a.XMLHttpRequest}catch(b){}}function $b(){try{return new a.ActiveXObject(\"Microsoft.XMLHTTP\")}catch(b){}}m.ajaxSetup({accepts:{script:\"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"},contents:{script:/(?:java|ecma)script/},converters:{\"text script\":function(a){return m.globalEval(a),a}}}),m.ajaxPrefilter(\"script\",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type=\"GET\",a.global=!1)}),m.ajaxTransport(\"script\",function(a){if(a.crossDomain){var b,c=y.head||m(\"head\")[0]||y.documentElement;return{send:function(d,e){b=y.createElement(\"script\"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,\"success\"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var _b=[],ac=/(=)\\?(?=&|$)|\\?\\?/;m.ajaxSetup({jsonp:\"callback\",jsonpCallback:function(){var a=_b.pop()||m.expando+\"_\"+vb++;return this[a]=!0,a}}),m.ajaxPrefilter(\"json jsonp\",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(ac.test(b.url)?\"url\":\"string\"==typeof b.data&&!(b.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&ac.test(b.data)&&\"data\");return h||\"jsonp\"===b.dataTypes[0]?(e=b.jsonpCallback=m.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(ac,\"$1\"+e):b.jsonp!==!1&&(b.url+=(wb.test(b.url)?\"&\":\"?\")+b.jsonp+\"=\"+e),b.converters[\"script json\"]=function(){return g||m.error(e+\" was not called\"),g[0]},b.dataTypes[0]=\"json\",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,_b.push(e)),g&&m.isFunction(f)&&f(g[0]),g=f=void 0}),\"script\"):void 0}),m.parseHTML=function(a,b,c){if(!a||\"string\"!=typeof a)return null;\"boolean\"==typeof b&&(c=b,b=!1),b=b||y;var d=u.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=m.buildFragment([a],b,e),e&&e.length&&m(e).remove(),m.merge([],d.childNodes))};var bc=m.fn.load;m.fn.load=function(a,b,c){if(\"string\"!=typeof a&&bc)return bc.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(\" \");return h>=0&&(d=m.trim(a.slice(h,a.length)),a=a.slice(0,h)),m.isFunction(b)?(c=b,b=void 0):b&&\"object\"==typeof b&&(f=\"POST\"),g.length>0&&m.ajax({url:a,type:f,dataType:\"html\",data:b}).done(function(a){e=arguments,g.html(d?m(\"<div>\").append(m.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},m.each([\"ajaxStart\",\"ajaxStop\",\"ajaxComplete\",\"ajaxError\",\"ajaxSuccess\",\"ajaxSend\"],function(a,b){m.fn[b]=function(a){return this.on(b,a)}}),m.expr.filters.animated=function(a){return m.grep(m.timers,function(b){return a===b.elem}).length};var cc=a.document.documentElement;function dc(a){return m.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}m.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=m.css(a,\"position\"),l=m(a),n={};\"static\"===k&&(a.style.position=\"relative\"),h=l.offset(),f=m.css(a,\"top\"),i=m.css(a,\"left\"),j=(\"absolute\"===k||\"fixed\"===k)&&m.inArray(\"auto\",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),m.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(n.top=b.top-h.top+g),null!=b.left&&(n.left=b.left-h.left+e),\"using\"in b?b.using.call(a,n):l.css(n)}},m.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){m.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,m.contains(b,e)?(typeof e.getBoundingClientRect!==K&&(d=e.getBoundingClientRect()),c=dc(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return\"fixed\"===m.css(d,\"position\")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),m.nodeName(a[0],\"html\")||(c=a.offset()),c.top+=m.css(a[0],\"borderTopWidth\",!0),c.left+=m.css(a[0],\"borderLeftWidth\",!0)),{top:b.top-c.top-m.css(d,\"marginTop\",!0),left:b.left-c.left-m.css(d,\"marginLeft\",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||cc;while(a&&!m.nodeName(a,\"html\")&&\"static\"===m.css(a,\"position\"))a=a.offsetParent;return a||cc})}}),m.each({scrollLeft:\"pageXOffset\",scrollTop:\"pageYOffset\"},function(a,b){var c=/Y/.test(b);m.fn[a]=function(d){return V(this,function(a,d,e){var f=dc(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?m(f).scrollLeft():e,c?e:m(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),m.each([\"top\",\"left\"],function(a,b){m.cssHooks[b]=La(k.pixelPosition,function(a,c){return c?(c=Ja(a,b),Ha.test(c)?m(a).position()[b]+\"px\":c):void 0})}),m.each({Height:\"height\",Width:\"width\"},function(a,b){m.each({padding:\"inner\"+a,content:b,\"\":\"outer\"+a},function(c,d){m.fn[d]=function(d,e){var f=arguments.length&&(c||\"boolean\"!=typeof d),g=c||(d===!0||e===!0?\"margin\":\"border\");return V(this,function(b,c,d){var e;return m.isWindow(b)?b.document.documentElement[\"client\"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body[\"scroll\"+a],e[\"scroll\"+a],b.body[\"offset\"+a],e[\"offset\"+a],e[\"client\"+a])):void 0===d?m.css(b,c,g):m.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),m.fn.size=function(){return this.length},m.fn.andSelf=m.fn.addBack,\"function\"==typeof define&&define.amd&&define(\"jquery\",[],function(){return m});var ec=a.jQuery,fc=a.$;return m.noConflict=function(b){return a.$===m&&(a.$=fc),b&&a.jQuery===m&&(a.jQuery=ec),m},typeof b===K&&(a.jQuery=a.$=m),m});\n"
  },
  {
    "path": "lib/werkzeug/debug/shared/style.css",
    "content": "@font-face {\n  font-family: 'Ubuntu';\n  font-style: normal;\n  font-weight: normal;\n  src: local('Ubuntu'), local('Ubuntu-Regular'),\n    url('?__debugger__=yes&cmd=resource&f=ubuntu.ttf') format('truetype');\n}\n\nbody, input  { font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva',\n               'Verdana', sans-serif; color: #000; text-align: center;\n               margin: 1em; padding: 0; font-size: 15px; }\nh1, h2, h3   { font-family: 'Ubuntu', 'Lucida Grande', 'Lucida Sans Unicode',\n               'Geneva', 'Verdana', sans-serif; font-weight: normal; }\n\ninput        { background-color: #fff; margin: 0; text-align: left;\n               outline: none !important; }\ninput[type=\"submit\"] { padding: 3px 6px; }\na            { color: #11557C; }\na:hover      { color: #177199; }\npre, code,\ntextarea     { font-family: 'Consolas', 'Monaco', 'Bitstream Vera Sans Mono',\n               monospace; font-size: 14px; }\n\ndiv.debugger { text-align: left; padding: 12px; margin: auto;\n               background-color: white; }\nh1           { font-size: 36px; margin: 0 0 0.3em 0; }\ndiv.detail p { margin: 0 0 8px 13px; font-size: 14px; white-space: pre-wrap; }\ndiv.explanation { margin: 20px 13px; font-size: 15px; color: #555; }\ndiv.footer   { font-size: 13px; text-align: right; margin: 30px 0;\n               color: #86989B; }\n\nh2           { font-size: 16px; margin: 1.3em 0 0.0 0; padding: 9px;\n               background-color: #11557C; color: white; }\nh2 em, h3 em { font-style: normal; color: #A5D6D9; font-weight: normal; }\n\ndiv.traceback, div.plain { border: 1px solid #ddd; margin: 0 0 1em 0; padding: 10px; }\ndiv.plain p      { margin: 0; }\ndiv.plain textarea,\ndiv.plain pre { margin: 10px 0 0 0; padding: 4px;\n                background-color: #E8EFF0; border: 1px solid #D3E7E9; }\ndiv.plain textarea { width: 99%; height: 300px; }\ndiv.traceback h3 { font-size: 1em; margin: 0 0 0.8em 0; }\ndiv.traceback ul { list-style: none; margin: 0; padding: 0 0 0 1em; }\ndiv.traceback h4 { font-size: 13px; font-weight: normal; margin: 0.7em 0 0.1em 0; }\ndiv.traceback pre { margin: 0; padding: 5px 0 3px 15px;\n                    background-color: #E8EFF0; border: 1px solid #D3E7E9; }\ndiv.traceback pre:hover { background-color: #DDECEE; color: black; cursor: pointer; }\ndiv.traceback div.source.expanded pre + pre { border-top: none; }\n\ndiv.traceback span.ws { display: none; }\ndiv.traceback pre.before, div.traceback pre.after { display: none; background: white; }\ndiv.traceback div.source.expanded pre.before,\ndiv.traceback div.source.expanded pre.after {\n    display: block;\n}\n\ndiv.traceback div.source.expanded span.ws {\n    display: inline;\n}\n\ndiv.traceback blockquote { margin: 1em 0 0 0; padding: 0; }\ndiv.traceback img { float: right; padding: 2px; margin: -3px 2px 0 0; display: none; }\ndiv.traceback img:hover { background-color: #ddd; cursor: pointer;\n                          border-color: #BFDDE0; }\ndiv.traceback pre:hover img { display: block; }\ndiv.traceback cite.filename { font-style: normal; color: #3B666B; }\n\npre.console { border: 1px solid #ccc; background: white!important;\n              color: black; padding: 5px!important;\n              margin: 3px 0 0 0!important; cursor: default!important;\n              max-height: 400px; overflow: auto; }\npre.console form { color: #555; }\npre.console input { background-color: transparent; color: #555;\n                    width: 90%; font-family: 'Consolas', 'Deja Vu Sans Mono',\n                    'Bitstream Vera Sans Mono', monospace; font-size: 14px;\n                     border: none!important; }\n\nspan.string { color: #30799B; }\nspan.number { color: #9C1A1C; }\nspan.help   { color: #3A7734; }\nspan.object { color: #485F6E; }\nspan.extended { opacity: 0.5; }\nspan.extended:hover { opacity: 1; }\na.toggle { text-decoration: none; background-repeat: no-repeat;\n           background-position: center center;\n           background-image: url(?__debugger__=yes&cmd=resource&f=more.png); }\na.toggle:hover { background-color: #444; }\na.open { background-image: url(?__debugger__=yes&cmd=resource&f=less.png); }\n\npre.console div.traceback,\npre.console div.box { margin: 5px 10px; white-space: normal;\n                      border: 1px solid #11557C; padding: 10px;\n                      font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva',\n                      'Verdana', sans-serif;  }\npre.console div.box h3,\npre.console div.traceback h3 { margin: -10px -10px 10px -10px; padding: 5px;\n                               background: #11557C; color: white; }\n\npre.console div.traceback pre:hover { cursor: default; background: #E8EFF0; }\npre.console div.traceback pre.syntaxerror { background: inherit; border: none;\n                                            margin: 20px -10px -10px -10px;\n                                            padding: 10px; border-top: 1px solid #BFDDE0;\n                                            background: #E8EFF0; }\npre.console div.noframe-traceback pre.syntaxerror { margin-top: -10px; border: none; }\n\npre.console div.box pre.repr { padding: 0; margin: 0; background-color: white; border: none; }\npre.console div.box table { margin-top: 6px; }\npre.console div.box pre { border: none; }\npre.console div.box pre.help { background-color: white; }\npre.console div.box pre.help:hover { cursor: default; }\npre.console table tr { vertical-align: top; }\ndiv.console { border: 1px solid #ccc; padding: 4px; background-color: #fafafa; }\n\ndiv.traceback pre, div.console pre {\n    white-space: pre-wrap;       /* css-3 should we be so lucky... */\n    white-space: -moz-pre-wrap;  /* Mozilla, since 1999 */\n    white-space: -pre-wrap;      /* Opera 4-6 ?? */\n    white-space: -o-pre-wrap;    /* Opera 7 ?? */\n    word-wrap: break-word;       /* Internet Explorer 5.5+ */\n    _white-space: pre;           /* IE only hack to re-specify in\n                                 addition to word-wrap  */\n}\n\n\ndiv.pin-prompt {\n    position: absolute;\n    display: none;\n    top: 0;\n    bottom: 0;\n    left: 0;\n    right: 0;\n    background: rgba(255, 255, 255, 0.8);\n}\n\ndiv.pin-prompt .inner {\n    background: #eee;\n    padding: 10px 50px;\n    width: 350px;\n    margin: 10% auto 0 auto;\n    border: 1px solid #ccc;\n    border-radius: 2px;\n}\n"
  },
  {
    "path": "lib/werkzeug/debug/tbtools.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    werkzeug.debug.tbtools\n    ~~~~~~~~~~~~~~~~~~~~~~\n\n    This module provides various traceback related utility functions.\n\n    :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details.\n    :license: BSD.\n\"\"\"\nimport re\n\nimport os\nimport sys\nimport json\nimport inspect\nimport traceback\nimport codecs\nfrom tokenize import TokenError\n\nfrom werkzeug.utils import cached_property, escape\nfrom werkzeug.debug.console import Console\nfrom werkzeug._compat import range_type, PY2, text_type, string_types, \\\n    to_native, to_unicode\nfrom werkzeug.filesystem import get_filesystem_encoding\n\n\n_coding_re = re.compile(br'coding[:=]\\s*([-\\w.]+)')\n_line_re = re.compile(br'^(.*?)$(?m)')\n_funcdef_re = re.compile(r'^(\\s*def\\s)|(.*(?<!\\w)lambda(:|\\s))|^(\\s*@)')\nUTF8_COOKIE = b'\\xef\\xbb\\xbf'\n\nsystem_exceptions = (SystemExit, KeyboardInterrupt)\ntry:\n    system_exceptions += (GeneratorExit,)\nexcept NameError:\n    pass\n\n\nHEADER = u'''\\\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"\n  \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n  <head>\n    <title>%(title)s // Werkzeug Debugger</title>\n    <link rel=\"stylesheet\" href=\"?__debugger__=yes&amp;cmd=resource&amp;f=style.css\"\n        type=\"text/css\">\n    <!-- We need to make sure this has a favicon so that the debugger does\n         not by accident trigger a request to /favicon.ico which might\n         change the application state. -->\n    <link rel=\"shortcut icon\"\n        href=\"?__debugger__=yes&amp;cmd=resource&amp;f=console.png\">\n    <script src=\"?__debugger__=yes&amp;cmd=resource&amp;f=jquery.js\"></script>\n    <script src=\"?__debugger__=yes&amp;cmd=resource&amp;f=debugger.js\"></script>\n    <script type=\"text/javascript\">\n      var TRACEBACK = %(traceback_id)d,\n          CONSOLE_MODE = %(console)s,\n          EVALEX = %(evalex)s,\n          EVALEX_TRUSTED = %(evalex_trusted)s,\n          SECRET = \"%(secret)s\";\n    </script>\n  </head>\n  <body>\n    <div class=\"debugger\">\n'''\nFOOTER = u'''\\\n      <div class=\"footer\">\n        Brought to you by <strong class=\"arthur\">DON'T PANIC</strong>, your\n        friendly Werkzeug powered traceback interpreter.\n      </div>\n    </div>\n\n    <div class=\"pin-prompt\">\n      <div class=\"inner\">\n        <h3>Console Locked</h3>\n        <p>\n          The console is locked and needs to be unlocked by entering the PIN.\n          You can find the PIN printed out on the standard output of your\n          shell that runs the server.\n        <form>\n          <p>PIN:\n            <input type=text name=pin size=14>\n            <input type=submit name=btn value=\"Confirm Pin\">\n        </form>\n      </div>\n    </div>\n  </body>\n</html>\n'''\n\nPAGE_HTML = HEADER + u'''\\\n<h1>%(exception_type)s</h1>\n<div class=\"detail\">\n  <p class=\"errormsg\">%(exception)s</p>\n</div>\n<h2 class=\"traceback\">Traceback <em>(most recent call last)</em></h2>\n%(summary)s\n<div class=\"plain\">\n  <form action=\"/?__debugger__=yes&amp;cmd=paste\" method=\"post\">\n    <p>\n      <input type=\"hidden\" name=\"language\" value=\"pytb\">\n      This is the Copy/Paste friendly version of the traceback.  <span\n      class=\"pastemessage\">You can also paste this traceback into\n      a <a href=\"https://gist.github.com/\">gist</a>:\n      <input type=\"submit\" value=\"create paste\"></span>\n    </p>\n    <textarea cols=\"50\" rows=\"10\" name=\"code\" readonly>%(plaintext)s</textarea>\n  </form>\n</div>\n<div class=\"explanation\">\n  The debugger caught an exception in your WSGI application.  You can now\n  look at the traceback which led to the error.  <span class=\"nojavascript\">\n  If you enable JavaScript you can also use additional features such as code\n  execution (if the evalex feature is enabled), automatic pasting of the\n  exceptions and much more.</span>\n</div>\n''' + FOOTER + '''\n<!--\n\n%(plaintext_cs)s\n\n-->\n'''\n\nCONSOLE_HTML = HEADER + u'''\\\n<h1>Interactive Console</h1>\n<div class=\"explanation\">\nIn this console you can execute Python expressions in the context of the\napplication.  The initial namespace was created by the debugger automatically.\n</div>\n<div class=\"console\"><div class=\"inner\">The Console requires JavaScript.</div></div>\n''' + FOOTER\n\nSUMMARY_HTML = u'''\\\n<div class=\"%(classes)s\">\n  %(title)s\n  <ul>%(frames)s</ul>\n  %(description)s\n</div>\n'''\n\nFRAME_HTML = u'''\\\n<div class=\"frame\" id=\"frame-%(id)d\">\n  <h4>File <cite class=\"filename\">\"%(filename)s\"</cite>,\n      line <em class=\"line\">%(lineno)s</em>,\n      in <code class=\"function\">%(function_name)s</code></h4>\n  <div class=\"source\">%(lines)s</div>\n</div>\n'''\n\nSOURCE_LINE_HTML = u'''\\\n<tr class=\"%(classes)s\">\n  <td class=lineno>%(lineno)s</td>\n  <td>%(code)s</td>\n</tr>\n'''\n\n\ndef render_console_html(secret, evalex_trusted=True):\n    return CONSOLE_HTML % {\n        'evalex':           'true',\n        'evalex_trusted':   evalex_trusted and 'true' or 'false',\n        'console':          'true',\n        'title':            'Console',\n        'secret':           secret,\n        'traceback_id': -1\n    }\n\n\ndef get_current_traceback(ignore_system_exceptions=False,\n                          show_hidden_frames=False, skip=0):\n    \"\"\"Get the current exception info as `Traceback` object.  Per default\n    calling this method will reraise system exceptions such as generator exit,\n    system exit or others.  This behavior can be disabled by passing `False`\n    to the function as first parameter.\n    \"\"\"\n    exc_type, exc_value, tb = sys.exc_info()\n    if ignore_system_exceptions and exc_type in system_exceptions:\n        raise\n    for x in range_type(skip):\n        if tb.tb_next is None:\n            break\n        tb = tb.tb_next\n    tb = Traceback(exc_type, exc_value, tb)\n    if not show_hidden_frames:\n        tb.filter_hidden_frames()\n    return tb\n\n\nclass Line(object):\n    \"\"\"Helper for the source renderer.\"\"\"\n    __slots__ = ('lineno', 'code', 'in_frame', 'current')\n\n    def __init__(self, lineno, code):\n        self.lineno = lineno\n        self.code = code\n        self.in_frame = False\n        self.current = False\n\n    def classes(self):\n        rv = ['line']\n        if self.in_frame:\n            rv.append('in-frame')\n        if self.current:\n            rv.append('current')\n        return rv\n    classes = property(classes)\n\n    def render(self):\n        return SOURCE_LINE_HTML % {\n            'classes':      u' '.join(self.classes),\n            'lineno':       self.lineno,\n            'code':         escape(self.code)\n        }\n\n\nclass Traceback(object):\n    \"\"\"Wraps a traceback.\"\"\"\n\n    def __init__(self, exc_type, exc_value, tb):\n        self.exc_type = exc_type\n        self.exc_value = exc_value\n        if not isinstance(exc_type, str):\n            exception_type = exc_type.__name__\n            if exc_type.__module__ not in ('__builtin__', 'exceptions'):\n                exception_type = exc_type.__module__ + '.' + exception_type\n        else:\n            exception_type = exc_type\n        self.exception_type = exception_type\n\n        # we only add frames to the list that are not hidden.  This follows\n        # the the magic variables as defined by paste.exceptions.collector\n        self.frames = []\n        while tb:\n            self.frames.append(Frame(exc_type, exc_value, tb))\n            tb = tb.tb_next\n\n    def filter_hidden_frames(self):\n        \"\"\"Remove the frames according to the paste spec.\"\"\"\n        if not self.frames:\n            return\n\n        new_frames = []\n        hidden = False\n        for frame in self.frames:\n            hide = frame.hide\n            if hide in ('before', 'before_and_this'):\n                new_frames = []\n                hidden = False\n                if hide == 'before_and_this':\n                    continue\n            elif hide in ('reset', 'reset_and_this'):\n                hidden = False\n                if hide == 'reset_and_this':\n                    continue\n            elif hide in ('after', 'after_and_this'):\n                hidden = True\n                if hide == 'after_and_this':\n                    continue\n            elif hide or hidden:\n                continue\n            new_frames.append(frame)\n\n        # if we only have one frame and that frame is from the codeop\n        # module, remove it.\n        if len(new_frames) == 1 and self.frames[0].module == 'codeop':\n            del self.frames[:]\n\n        # if the last frame is missing something went terrible wrong :(\n        elif self.frames[-1] in new_frames:\n            self.frames[:] = new_frames\n\n    def is_syntax_error(self):\n        \"\"\"Is it a syntax error?\"\"\"\n        return isinstance(self.exc_value, SyntaxError)\n    is_syntax_error = property(is_syntax_error)\n\n    def exception(self):\n        \"\"\"String representation of the exception.\"\"\"\n        buf = traceback.format_exception_only(self.exc_type, self.exc_value)\n        rv = ''.join(buf).strip()\n        return rv.decode('utf-8', 'replace') if PY2 else rv\n    exception = property(exception)\n\n    def log(self, logfile=None):\n        \"\"\"Log the ASCII traceback into a file object.\"\"\"\n        if logfile is None:\n            logfile = sys.stderr\n        tb = self.plaintext.rstrip() + u'\\n'\n        if PY2:\n            tb = tb.encode('utf-8', 'replace')\n        logfile.write(tb)\n\n    def paste(self):\n        \"\"\"Create a paste and return the paste id.\"\"\"\n        data = json.dumps({\n            'description': 'Werkzeug Internal Server Error',\n            'public': False,\n            'files': {\n                'traceback.txt': {\n                    'content': self.plaintext\n                }\n            }\n        }).encode('utf-8')\n        try:\n            from urllib2 import urlopen\n        except ImportError:\n            from urllib.request import urlopen\n        rv = urlopen('https://api.github.com/gists', data=data)\n        resp = json.loads(rv.read().decode('utf-8'))\n        rv.close()\n        return {\n            'url': resp['html_url'],\n            'id': resp['id']\n        }\n\n    def render_summary(self, include_title=True):\n        \"\"\"Render the traceback for the interactive console.\"\"\"\n        title = ''\n        frames = []\n        classes = ['traceback']\n        if not self.frames:\n            classes.append('noframe-traceback')\n\n        if include_title:\n            if self.is_syntax_error:\n                title = u'Syntax Error'\n            else:\n                title = u'Traceback <em>(most recent call last)</em>:'\n\n        for frame in self.frames:\n            frames.append(u'<li%s>%s' % (\n                frame.info and u' title=\"%s\"' % escape(frame.info) or u'',\n                frame.render()\n            ))\n\n        if self.is_syntax_error:\n            description_wrapper = u'<pre class=syntaxerror>%s</pre>'\n        else:\n            description_wrapper = u'<blockquote>%s</blockquote>'\n\n        return SUMMARY_HTML % {\n            'classes':      u' '.join(classes),\n            'title':        title and u'<h3>%s</h3>' % title or u'',\n            'frames':       u'\\n'.join(frames),\n            'description':  description_wrapper % escape(self.exception)\n        }\n\n    def render_full(self, evalex=False, secret=None,\n                    evalex_trusted=True):\n        \"\"\"Render the Full HTML page with the traceback info.\"\"\"\n        exc = escape(self.exception)\n        return PAGE_HTML % {\n            'evalex':           evalex and 'true' or 'false',\n            'evalex_trusted':   evalex_trusted and 'true' or 'false',\n            'console':          'false',\n            'title':            exc,\n            'exception':        exc,\n            'exception_type':   escape(self.exception_type),\n            'summary':          self.render_summary(include_title=False),\n            'plaintext':        self.plaintext,\n            'plaintext_cs':     re.sub('-{2,}', '-', self.plaintext),\n            'traceback_id':     self.id,\n            'secret':           secret\n        }\n\n    def generate_plaintext_traceback(self):\n        \"\"\"Like the plaintext attribute but returns a generator\"\"\"\n        yield u'Traceback (most recent call last):'\n        for frame in self.frames:\n            yield u'  File \"%s\", line %s, in %s' % (\n                frame.filename,\n                frame.lineno,\n                frame.function_name\n            )\n            yield u'    ' + frame.current_line.strip()\n        yield self.exception\n\n    def plaintext(self):\n        return u'\\n'.join(self.generate_plaintext_traceback())\n    plaintext = cached_property(plaintext)\n\n    id = property(lambda x: id(x))\n\n\nclass Frame(object):\n\n    \"\"\"A single frame in a traceback.\"\"\"\n\n    def __init__(self, exc_type, exc_value, tb):\n        self.lineno = tb.tb_lineno\n        self.function_name = tb.tb_frame.f_code.co_name\n        self.locals = tb.tb_frame.f_locals\n        self.globals = tb.tb_frame.f_globals\n\n        fn = inspect.getsourcefile(tb) or inspect.getfile(tb)\n        if fn[-4:] in ('.pyo', '.pyc'):\n            fn = fn[:-1]\n        # if it's a file on the file system resolve the real filename.\n        if os.path.isfile(fn):\n            fn = os.path.realpath(fn)\n        self.filename = to_unicode(fn, get_filesystem_encoding())\n        self.module = self.globals.get('__name__')\n        self.loader = self.globals.get('__loader__')\n        self.code = tb.tb_frame.f_code\n\n        # support for paste's traceback extensions\n        self.hide = self.locals.get('__traceback_hide__', False)\n        info = self.locals.get('__traceback_info__')\n        if info is not None:\n            try:\n                info = text_type(info)\n            except UnicodeError:\n                info = str(info).decode('utf-8', 'replace')\n        self.info = info\n\n    def render(self):\n        \"\"\"Render a single frame in a traceback.\"\"\"\n        return FRAME_HTML % {\n            'id':               self.id,\n            'filename':         escape(self.filename),\n            'lineno':           self.lineno,\n            'function_name':    escape(self.function_name),\n            'lines':            self.render_line_context(),\n        }\n\n    def render_line_context(self):\n        before, current, after = self.get_context_lines()\n        rv = []\n\n        def render_line(line, cls):\n            line = line.expandtabs().rstrip()\n            stripped_line = line.strip()\n            prefix = len(line) - len(stripped_line)\n            rv.append(\n                '<pre class=\"line %s\"><span class=\"ws\">%s</span>%s</pre>' % (\n                    cls, ' ' * prefix, escape(stripped_line) or ' '))\n\n        for line in before:\n            render_line(line, 'before')\n        render_line(current, 'current')\n        for line in after:\n            render_line(line, 'after')\n\n        return '\\n'.join(rv)\n\n    def get_annotated_lines(self):\n        \"\"\"Helper function that returns lines with extra information.\"\"\"\n        lines = [Line(idx + 1, x) for idx, x in enumerate(self.sourcelines)]\n\n        # find function definition and mark lines\n        if hasattr(self.code, 'co_firstlineno'):\n            lineno = self.code.co_firstlineno - 1\n            while lineno > 0:\n                if _funcdef_re.match(lines[lineno].code):\n                    break\n                lineno -= 1\n            try:\n                offset = len(inspect.getblock([x.code + '\\n' for x\n                                               in lines[lineno:]]))\n            except TokenError:\n                offset = 0\n            for line in lines[lineno:lineno + offset]:\n                line.in_frame = True\n\n        # mark current line\n        try:\n            lines[self.lineno - 1].current = True\n        except IndexError:\n            pass\n\n        return lines\n\n    def eval(self, code, mode='single'):\n        \"\"\"Evaluate code in the context of the frame.\"\"\"\n        if isinstance(code, string_types):\n            if PY2 and isinstance(code, unicode):  # noqa\n                code = UTF8_COOKIE + code.encode('utf-8')\n            code = compile(code, '<interactive>', mode)\n        return eval(code, self.globals, self.locals)\n\n    @cached_property\n    def sourcelines(self):\n        \"\"\"The sourcecode of the file as list of unicode strings.\"\"\"\n        # get sourcecode from loader or file\n        source = None\n        if self.loader is not None:\n            try:\n                if hasattr(self.loader, 'get_source'):\n                    source = self.loader.get_source(self.module)\n                elif hasattr(self.loader, 'get_source_by_code'):\n                    source = self.loader.get_source_by_code(self.code)\n            except Exception:\n                # we munch the exception so that we don't cause troubles\n                # if the loader is broken.\n                pass\n\n        if source is None:\n            try:\n                f = open(to_native(self.filename, get_filesystem_encoding()),\n                         mode='rb')\n            except IOError:\n                return []\n            try:\n                source = f.read()\n            finally:\n                f.close()\n\n        # already unicode?  return right away\n        if isinstance(source, text_type):\n            return source.splitlines()\n\n        # yes. it should be ascii, but we don't want to reject too many\n        # characters in the debugger if something breaks\n        charset = 'utf-8'\n        if source.startswith(UTF8_COOKIE):\n            source = source[3:]\n        else:\n            for idx, match in enumerate(_line_re.finditer(source)):\n                match = _coding_re.search(match.group())\n                if match is not None:\n                    charset = match.group(1)\n                    break\n                if idx > 1:\n                    break\n\n        # on broken cookies we fall back to utf-8 too\n        charset = to_native(charset)\n        try:\n            codecs.lookup(charset)\n        except LookupError:\n            charset = 'utf-8'\n\n        return source.decode(charset, 'replace').splitlines()\n\n    def get_context_lines(self, context=5):\n        before = self.sourcelines[self.lineno - context - 1:self.lineno - 1]\n        past = self.sourcelines[self.lineno:self.lineno + context]\n        return (\n            before,\n            self.current_line,\n            past,\n        )\n\n    @property\n    def current_line(self):\n        try:\n            return self.sourcelines[self.lineno - 1]\n        except IndexError:\n            return u''\n\n    @cached_property\n    def console(self):\n        return Console(self.globals, self.locals)\n\n    id = property(lambda x: id(x))\n"
  },
  {
    "path": "lib/werkzeug/exceptions.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    werkzeug.exceptions\n    ~~~~~~~~~~~~~~~~~~~\n\n    This module implements a number of Python exceptions you can raise from\n    within your views to trigger a standard non-200 response.\n\n\n    Usage Example\n    -------------\n\n    ::\n\n        from werkzeug.wrappers import BaseRequest\n        from werkzeug.wsgi import responder\n        from werkzeug.exceptions import HTTPException, NotFound\n\n        def view(request):\n            raise NotFound()\n\n        @responder\n        def application(environ, start_response):\n            request = BaseRequest(environ)\n            try:\n                return view(request)\n            except HTTPException as e:\n                return e\n\n\n    As you can see from this example those exceptions are callable WSGI\n    applications.  Because of Python 2.4 compatibility those do not extend\n    from the response objects but only from the python exception class.\n\n    As a matter of fact they are not Werkzeug response objects.  However you\n    can get a response object by calling ``get_response()`` on a HTTP\n    exception.\n\n    Keep in mind that you have to pass an environment to ``get_response()``\n    because some errors fetch additional information from the WSGI\n    environment.\n\n    If you want to hook in a different exception page to say, a 404 status\n    code, you can add a second except for a specific subclass of an error::\n\n        @responder\n        def application(environ, start_response):\n            request = BaseRequest(environ)\n            try:\n                return view(request)\n            except NotFound, e:\n                return not_found(request)\n            except HTTPException, e:\n                return e\n\n\n    :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nimport sys\n\n# Because of bootstrapping reasons we need to manually patch ourselves\n# onto our parent module.\nimport werkzeug\nwerkzeug.exceptions = sys.modules[__name__]\n\nfrom werkzeug._internal import _get_environ\nfrom werkzeug._compat import iteritems, integer_types, text_type, \\\n    implements_to_string\n\nfrom werkzeug.wrappers import Response\n\n\n@implements_to_string\nclass HTTPException(Exception):\n\n    \"\"\"\n    Baseclass for all HTTP exceptions.  This exception can be called as WSGI\n    application to render a default error page or you can catch the subclasses\n    of it independently and render nicer error messages.\n    \"\"\"\n\n    code = None\n    description = None\n\n    def __init__(self, description=None, response=None):\n        Exception.__init__(self)\n        if description is not None:\n            self.description = description\n        self.response = response\n\n    @classmethod\n    def wrap(cls, exception, name=None):\n        \"\"\"This method returns a new subclass of the exception provided that\n        also is a subclass of `BadRequest`.\n        \"\"\"\n        class newcls(cls, exception):\n\n            def __init__(self, arg=None, *args, **kwargs):\n                cls.__init__(self, *args, **kwargs)\n                exception.__init__(self, arg)\n        newcls.__module__ = sys._getframe(1).f_globals.get('__name__')\n        newcls.__name__ = name or cls.__name__ + exception.__name__\n        return newcls\n\n    @property\n    def name(self):\n        \"\"\"The status name.\"\"\"\n        return HTTP_STATUS_CODES.get(self.code, 'Unknown Error')\n\n    def get_description(self, environ=None):\n        \"\"\"Get the description.\"\"\"\n        return u'<p>%s</p>' % escape(self.description)\n\n    def get_body(self, environ=None):\n        \"\"\"Get the HTML body.\"\"\"\n        return text_type((\n            u'<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\\n'\n            u'<title>%(code)s %(name)s</title>\\n'\n            u'<h1>%(name)s</h1>\\n'\n            u'%(description)s\\n'\n        ) % {\n            'code':         self.code,\n            'name':         escape(self.name),\n            'description':  self.get_description(environ)\n        })\n\n    def get_headers(self, environ=None):\n        \"\"\"Get a list of headers.\"\"\"\n        return [('Content-Type', 'text/html')]\n\n    def get_response(self, environ=None):\n        \"\"\"Get a response object.  If one was passed to the exception\n        it's returned directly.\n\n        :param environ: the optional environ for the request.  This\n                        can be used to modify the response depending\n                        on how the request looked like.\n        :return: a :class:`Response` object or a subclass thereof.\n        \"\"\"\n        if self.response is not None:\n            return self.response\n        if environ is not None:\n            environ = _get_environ(environ)\n        headers = self.get_headers(environ)\n        return Response(self.get_body(environ), self.code, headers)\n\n    def __call__(self, environ, start_response):\n        \"\"\"Call the exception as WSGI application.\n\n        :param environ: the WSGI environment.\n        :param start_response: the response callable provided by the WSGI\n                               server.\n        \"\"\"\n        response = self.get_response(environ)\n        return response(environ, start_response)\n\n    def __str__(self):\n        return '%d: %s' % (self.code, self.name)\n\n    def __repr__(self):\n        return '<%s \\'%s\\'>' % (self.__class__.__name__, self)\n\n\nclass BadRequest(HTTPException):\n\n    \"\"\"*400* `Bad Request`\n\n    Raise if the browser sends something to the application the application\n    or server cannot handle.\n    \"\"\"\n    code = 400\n    description = (\n        'The browser (or proxy) sent a request that this server could '\n        'not understand.'\n    )\n\n\nclass ClientDisconnected(BadRequest):\n\n    \"\"\"Internal exception that is raised if Werkzeug detects a disconnected\n    client.  Since the client is already gone at that point attempting to\n    send the error message to the client might not work and might ultimately\n    result in another exception in the server.  Mainly this is here so that\n    it is silenced by default as far as Werkzeug is concerned.\n\n    Since disconnections cannot be reliably detected and are unspecified\n    by WSGI to a large extent this might or might not be raised if a client\n    is gone.\n\n    .. versionadded:: 0.8\n    \"\"\"\n\n\nclass SecurityError(BadRequest):\n\n    \"\"\"Raised if something triggers a security error.  This is otherwise\n    exactly like a bad request error.\n\n    .. versionadded:: 0.9\n    \"\"\"\n\n\nclass Unauthorized(HTTPException):\n\n    \"\"\"*401* `Unauthorized`\n\n    Raise if the user is not authorized.  Also used if you want to use HTTP\n    basic auth.\n    \"\"\"\n    code = 401\n    description = (\n        'The server could not verify that you are authorized to access '\n        'the URL requested.  You either supplied the wrong credentials (e.g. '\n        'a bad password), or your browser doesn\\'t understand how to supply '\n        'the credentials required.'\n    )\n\n\nclass Forbidden(HTTPException):\n\n    \"\"\"*403* `Forbidden`\n\n    Raise if the user doesn't have the permission for the requested resource\n    but was authenticated.\n    \"\"\"\n    code = 403\n    description = (\n        'You don\\'t have the permission to access the requested resource. '\n        'It is either read-protected or not readable by the server.'\n    )\n\n\nclass NotFound(HTTPException):\n\n    \"\"\"*404* `Not Found`\n\n    Raise if a resource does not exist and never existed.\n    \"\"\"\n    code = 404\n    description = (\n        'The requested URL was not found on the server.  '\n        'If you entered the URL manually please check your spelling and '\n        'try again.'\n    )\n\n\nclass MethodNotAllowed(HTTPException):\n\n    \"\"\"*405* `Method Not Allowed`\n\n    Raise if the server used a method the resource does not handle.  For\n    example `POST` if the resource is view only.  Especially useful for REST.\n\n    The first argument for this exception should be a list of allowed methods.\n    Strictly speaking the response would be invalid if you don't provide valid\n    methods in the header which you can do with that list.\n    \"\"\"\n    code = 405\n    description = 'The method is not allowed for the requested URL.'\n\n    def __init__(self, valid_methods=None, description=None):\n        \"\"\"Takes an optional list of valid http methods\n        starting with werkzeug 0.3 the list will be mandatory.\"\"\"\n        HTTPException.__init__(self, description)\n        self.valid_methods = valid_methods\n\n    def get_headers(self, environ):\n        headers = HTTPException.get_headers(self, environ)\n        if self.valid_methods:\n            headers.append(('Allow', ', '.join(self.valid_methods)))\n        return headers\n\n\nclass NotAcceptable(HTTPException):\n\n    \"\"\"*406* `Not Acceptable`\n\n    Raise if the server can't return any content conforming to the\n    `Accept` headers of the client.\n    \"\"\"\n    code = 406\n\n    description = (\n        'The resource identified by the request is only capable of '\n        'generating response entities which have content characteristics '\n        'not acceptable according to the accept headers sent in the '\n        'request.'\n    )\n\n\nclass RequestTimeout(HTTPException):\n\n    \"\"\"*408* `Request Timeout`\n\n    Raise to signalize a timeout.\n    \"\"\"\n    code = 408\n    description = (\n        'The server closed the network connection because the browser '\n        'didn\\'t finish the request within the specified time.'\n    )\n\n\nclass Conflict(HTTPException):\n\n    \"\"\"*409* `Conflict`\n\n    Raise to signal that a request cannot be completed because it conflicts\n    with the current state on the server.\n\n    .. versionadded:: 0.7\n    \"\"\"\n    code = 409\n    description = (\n        'A conflict happened while processing the request.  The resource '\n        'might have been modified while the request was being processed.'\n    )\n\n\nclass Gone(HTTPException):\n\n    \"\"\"*410* `Gone`\n\n    Raise if a resource existed previously and went away without new location.\n    \"\"\"\n    code = 410\n    description = (\n        'The requested URL is no longer available on this server and there '\n        'is no forwarding address. If you followed a link from a foreign '\n        'page, please contact the author of this page.'\n    )\n\n\nclass LengthRequired(HTTPException):\n\n    \"\"\"*411* `Length Required`\n\n    Raise if the browser submitted data but no ``Content-Length`` header which\n    is required for the kind of processing the server does.\n    \"\"\"\n    code = 411\n    description = (\n        'A request with this method requires a valid <code>Content-'\n        'Length</code> header.'\n    )\n\n\nclass PreconditionFailed(HTTPException):\n\n    \"\"\"*412* `Precondition Failed`\n\n    Status code used in combination with ``If-Match``, ``If-None-Match``, or\n    ``If-Unmodified-Since``.\n    \"\"\"\n    code = 412\n    description = (\n        'The precondition on the request for the URL failed positive '\n        'evaluation.'\n    )\n\n\nclass RequestEntityTooLarge(HTTPException):\n\n    \"\"\"*413* `Request Entity Too Large`\n\n    The status code one should return if the data submitted exceeded a given\n    limit.\n    \"\"\"\n    code = 413\n    description = (\n        'The data value transmitted exceeds the capacity limit.'\n    )\n\n\nclass RequestURITooLarge(HTTPException):\n\n    \"\"\"*414* `Request URI Too Large`\n\n    Like *413* but for too long URLs.\n    \"\"\"\n    code = 414\n    description = (\n        'The length of the requested URL exceeds the capacity limit '\n        'for this server.  The request cannot be processed.'\n    )\n\n\nclass UnsupportedMediaType(HTTPException):\n\n    \"\"\"*415* `Unsupported Media Type`\n\n    The status code returned if the server is unable to handle the media type\n    the client transmitted.\n    \"\"\"\n    code = 415\n    description = (\n        'The server does not support the media type transmitted in '\n        'the request.'\n    )\n\n\nclass RequestedRangeNotSatisfiable(HTTPException):\n\n    \"\"\"*416* `Requested Range Not Satisfiable`\n\n    The client asked for a part of the file that lies beyond the end\n    of the file.\n\n    .. versionadded:: 0.7\n    \"\"\"\n    code = 416\n    description = (\n        'The server cannot provide the requested range.'\n    )\n\n\nclass ExpectationFailed(HTTPException):\n\n    \"\"\"*417* `Expectation Failed`\n\n    The server cannot meet the requirements of the Expect request-header.\n\n    .. versionadded:: 0.7\n    \"\"\"\n    code = 417\n    description = (\n        'The server could not meet the requirements of the Expect header'\n    )\n\n\nclass ImATeapot(HTTPException):\n\n    \"\"\"*418* `I'm a teapot`\n\n    The server should return this if it is a teapot and someone attempted\n    to brew coffee with it.\n\n    .. versionadded:: 0.7\n    \"\"\"\n    code = 418\n    description = (\n        'This server is a teapot, not a coffee machine'\n    )\n\n\nclass UnprocessableEntity(HTTPException):\n\n    \"\"\"*422* `Unprocessable Entity`\n\n    Used if the request is well formed, but the instructions are otherwise\n    incorrect.\n    \"\"\"\n    code = 422\n    description = (\n        'The request was well-formed but was unable to be followed '\n        'due to semantic errors.'\n    )\n\n\nclass PreconditionRequired(HTTPException):\n\n    \"\"\"*428* `Precondition Required`\n\n    The server requires this request to be conditional, typically to prevent\n    the lost update problem, which is a race condition between two or more\n    clients attempting to update a resource through PUT or DELETE. By requiring\n    each client to include a conditional header (\"If-Match\" or \"If-Unmodified-\n    Since\") with the proper value retained from a recent GET request, the\n    server ensures that each client has at least seen the previous revision of\n    the resource.\n    \"\"\"\n    code = 428\n    description = (\n        'This request is required to be conditional; try using \"If-Match\" '\n        'or \"If-Unmodified-Since\".'\n    )\n\n\nclass TooManyRequests(HTTPException):\n\n    \"\"\"*429* `Too Many Requests`\n\n    The server is limiting the rate at which this user receives responses, and\n    this request exceeds that rate. (The server may use any convenient method\n    to identify users and their request rates). The server may include a\n    \"Retry-After\" header to indicate how long the user should wait before\n    retrying.\n    \"\"\"\n    code = 429\n    description = (\n        'This user has exceeded an allotted request count. Try again later.'\n    )\n\n\nclass RequestHeaderFieldsTooLarge(HTTPException):\n\n    \"\"\"*431* `Request Header Fields Too Large`\n\n    The server refuses to process the request because the header fields are too\n    large. One or more individual fields may be too large, or the set of all\n    headers is too large.\n    \"\"\"\n    code = 431\n    description = (\n        'One or more header fields exceeds the maximum size.'\n    )\n\n\nclass InternalServerError(HTTPException):\n\n    \"\"\"*500* `Internal Server Error`\n\n    Raise if an internal server error occurred.  This is a good fallback if an\n    unknown error occurred in the dispatcher.\n    \"\"\"\n    code = 500\n    description = (\n        'The server encountered an internal error and was unable to '\n        'complete your request.  Either the server is overloaded or there '\n        'is an error in the application.'\n    )\n\n\nclass NotImplemented(HTTPException):\n\n    \"\"\"*501* `Not Implemented`\n\n    Raise if the application does not support the action requested by the\n    browser.\n    \"\"\"\n    code = 501\n    description = (\n        'The server does not support the action requested by the '\n        'browser.'\n    )\n\n\nclass BadGateway(HTTPException):\n\n    \"\"\"*502* `Bad Gateway`\n\n    If you do proxying in your application you should return this status code\n    if you received an invalid response from the upstream server it accessed\n    in attempting to fulfill the request.\n    \"\"\"\n    code = 502\n    description = (\n        'The proxy server received an invalid response from an upstream '\n        'server.'\n    )\n\n\nclass ServiceUnavailable(HTTPException):\n\n    \"\"\"*503* `Service Unavailable`\n\n    Status code you should return if a service is temporarily unavailable.\n    \"\"\"\n    code = 503\n    description = (\n        'The server is temporarily unable to service your request due to '\n        'maintenance downtime or capacity problems.  Please try again '\n        'later.'\n    )\n\n\nclass GatewayTimeout(HTTPException):\n\n    \"\"\"*504* `Gateway Timeout`\n\n    Status code you should return if a connection to an upstream server\n    times out.\n    \"\"\"\n    code = 504\n    description = (\n        'The connection to an upstream server timed out.'\n    )\n\n\nclass HTTPVersionNotSupported(HTTPException):\n\n    \"\"\"*505* `HTTP Version Not Supported`\n\n    The server does not support the HTTP protocol version used in the request.\n    \"\"\"\n    code = 505\n    description = (\n        'The server does not support the HTTP protocol version used in the '\n        'request.'\n    )\n\n\ndefault_exceptions = {}\n__all__ = ['HTTPException']\n\n\ndef _find_exceptions():\n    for name, obj in iteritems(globals()):\n        try:\n            is_http_exception = issubclass(obj, HTTPException)\n        except TypeError:\n            is_http_exception = False\n        if not is_http_exception or obj.code is None:\n            continue\n        __all__.append(obj.__name__)\n        old_obj = default_exceptions.get(obj.code, None)\n        if old_obj is not None and issubclass(obj, old_obj):\n            continue\n        default_exceptions[obj.code] = obj\n_find_exceptions()\ndel _find_exceptions\n\n\nclass Aborter(object):\n\n    \"\"\"\n    When passed a dict of code -> exception items it can be used as\n    callable that raises exceptions.  If the first argument to the\n    callable is an integer it will be looked up in the mapping, if it's\n    a WSGI application it will be raised in a proxy exception.\n\n    The rest of the arguments are forwarded to the exception constructor.\n    \"\"\"\n\n    def __init__(self, mapping=None, extra=None):\n        if mapping is None:\n            mapping = default_exceptions\n        self.mapping = dict(mapping)\n        if extra is not None:\n            self.mapping.update(extra)\n\n    def __call__(self, code, *args, **kwargs):\n        if not args and not kwargs and not isinstance(code, integer_types):\n            raise HTTPException(response=code)\n        if code not in self.mapping:\n            raise LookupError('no exception for %r' % code)\n        raise self.mapping[code](*args, **kwargs)\n\nabort = Aborter()\n\n\n#: an exception that is used internally to signal both a key error and a\n#: bad request.  Used by a lot of the datastructures.\nBadRequestKeyError = BadRequest.wrap(KeyError)\n\n\n# imported here because of circular dependencies of werkzeug.utils\nfrom werkzeug.utils import escape\nfrom werkzeug.http import HTTP_STATUS_CODES\n"
  },
  {
    "path": "lib/werkzeug/filesystem.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    werkzeug.filesystem\n    ~~~~~~~~~~~~~~~~~~~\n\n    Various utilities for the local filesystem.\n\n    :copyright: (c) 2015 by the Werkzeug Team, see AUTHORS for more details.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\n\nimport codecs\nimport sys\nimport warnings\n\n# We do not trust traditional unixes.\nhas_likely_buggy_unicode_filesystem = \\\n    sys.platform.startswith('linux') or 'bsd' in sys.platform\n\n\ndef _is_ascii_encoding(encoding):\n    \"\"\"\n    Given an encoding this figures out if the encoding is actually ASCII (which\n    is something we don't actually want in most cases). This is necessary\n    because ASCII comes under many names such as ANSI_X3.4-1968.\n    \"\"\"\n    if encoding is None:\n        return False\n    try:\n        return codecs.lookup(encoding).name == 'ascii'\n    except LookupError:\n        return False\n\n\nclass BrokenFilesystemWarning(RuntimeWarning, UnicodeWarning):\n    '''The warning used by Werkzeug to signal a broken filesystem. Will only be\n    used once per runtime.'''\n\n\n_warned_about_filesystem_encoding = False\n\n\ndef get_filesystem_encoding():\n    \"\"\"\n    Returns the filesystem encoding that should be used. Note that this is\n    different from the Python understanding of the filesystem encoding which\n    might be deeply flawed. Do not use this value against Python's unicode APIs\n    because it might be different. See :ref:`filesystem-encoding` for the exact\n    behavior.\n\n    The concept of a filesystem encoding in generally is not something you\n    should rely on. As such if you ever need to use this function except for\n    writing wrapper code reconsider.\n    \"\"\"\n    global _warned_about_filesystem_encoding\n    rv = sys.getfilesystemencoding()\n    if has_likely_buggy_unicode_filesystem and not rv \\\n       or _is_ascii_encoding(rv):\n        if not _warned_about_filesystem_encoding:\n            warnings.warn(\n                'Detected a misconfigured UNIX filesystem: Will use UTF-8 as '\n                'filesystem encoding instead of {!r}'.format(rv),\n                BrokenFilesystemWarning)\n            _warned_about_filesystem_encoding = True\n        return 'utf-8'\n    return rv\n"
  },
  {
    "path": "lib/werkzeug/formparser.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    werkzeug.formparser\n    ~~~~~~~~~~~~~~~~~~~\n\n    This module implements the form parsing.  It supports url-encoded forms\n    as well as non-nested multipart uploads.\n\n    :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nimport re\nimport codecs\nfrom io import BytesIO\nfrom tempfile import TemporaryFile\nfrom itertools import chain, repeat, tee\nfrom functools import update_wrapper\n\nfrom werkzeug._compat import to_native, text_type\nfrom werkzeug.urls import url_decode_stream\nfrom werkzeug.wsgi import make_line_iter, \\\n    get_input_stream, get_content_length\nfrom werkzeug.datastructures import Headers, FileStorage, MultiDict\nfrom werkzeug.http import parse_options_header\n\n\n#: an iterator that yields empty strings\n_empty_string_iter = repeat('')\n\n#: a regular expression for multipart boundaries\n_multipart_boundary_re = re.compile('^[ -~]{0,200}[!-~]$')\n\n#: supported http encodings that are also available in python we support\n#: for multipart messages.\n_supported_multipart_encodings = frozenset(['base64', 'quoted-printable'])\n\n\ndef default_stream_factory(total_content_length, filename, content_type,\n                           content_length=None):\n    \"\"\"The stream factory that is used per default.\"\"\"\n    if total_content_length > 1024 * 500:\n        return TemporaryFile('wb+')\n    return BytesIO()\n\n\ndef parse_form_data(environ, stream_factory=None, charset='utf-8',\n                    errors='replace', max_form_memory_size=None,\n                    max_content_length=None, cls=None,\n                    silent=True):\n    \"\"\"Parse the form data in the environ and return it as tuple in the form\n    ``(stream, form, files)``.  You should only call this method if the\n    transport method is `POST`, `PUT`, or `PATCH`.\n\n    If the mimetype of the data transmitted is `multipart/form-data` the\n    files multidict will be filled with `FileStorage` objects.  If the\n    mimetype is unknown the input stream is wrapped and returned as first\n    argument, else the stream is empty.\n\n    This is a shortcut for the common usage of :class:`FormDataParser`.\n\n    Have a look at :ref:`dealing-with-request-data` for more details.\n\n    .. versionadded:: 0.5\n       The `max_form_memory_size`, `max_content_length` and\n       `cls` parameters were added.\n\n    .. versionadded:: 0.5.1\n       The optional `silent` flag was added.\n\n    :param environ: the WSGI environment to be used for parsing.\n    :param stream_factory: An optional callable that returns a new read and\n                           writeable file descriptor.  This callable works\n                           the same as :meth:`~BaseResponse._get_file_stream`.\n    :param charset: The character set for URL and url encoded form data.\n    :param errors: The encoding error behavior.\n    :param max_form_memory_size: the maximum number of bytes to be accepted for\n                           in-memory stored form data.  If the data\n                           exceeds the value specified an\n                           :exc:`~exceptions.RequestEntityTooLarge`\n                           exception is raised.\n    :param max_content_length: If this is provided and the transmitted data\n                               is longer than this value an\n                               :exc:`~exceptions.RequestEntityTooLarge`\n                               exception is raised.\n    :param cls: an optional dict class to use.  If this is not specified\n                       or `None` the default :class:`MultiDict` is used.\n    :param silent: If set to False parsing errors will not be caught.\n    :return: A tuple in the form ``(stream, form, files)``.\n    \"\"\"\n    return FormDataParser(stream_factory, charset, errors,\n                          max_form_memory_size, max_content_length,\n                          cls, silent).parse_from_environ(environ)\n\n\ndef exhaust_stream(f):\n    \"\"\"Helper decorator for methods that exhausts the stream on return.\"\"\"\n\n    def wrapper(self, stream, *args, **kwargs):\n        try:\n            return f(self, stream, *args, **kwargs)\n        finally:\n            exhaust = getattr(stream, 'exhaust', None)\n            if exhaust is not None:\n                exhaust()\n            else:\n                while 1:\n                    chunk = stream.read(1024 * 64)\n                    if not chunk:\n                        break\n    return update_wrapper(wrapper, f)\n\n\nclass FormDataParser(object):\n\n    \"\"\"This class implements parsing of form data for Werkzeug.  By itself\n    it can parse multipart and url encoded form data.  It can be subclassed\n    and extended but for most mimetypes it is a better idea to use the\n    untouched stream and expose it as separate attributes on a request\n    object.\n\n    .. versionadded:: 0.8\n\n    :param stream_factory: An optional callable that returns a new read and\n                           writeable file descriptor.  This callable works\n                           the same as :meth:`~BaseResponse._get_file_stream`.\n    :param charset: The character set for URL and url encoded form data.\n    :param errors: The encoding error behavior.\n    :param max_form_memory_size: the maximum number of bytes to be accepted for\n                           in-memory stored form data.  If the data\n                           exceeds the value specified an\n                           :exc:`~exceptions.RequestEntityTooLarge`\n                           exception is raised.\n    :param max_content_length: If this is provided and the transmitted data\n                               is longer than this value an\n                               :exc:`~exceptions.RequestEntityTooLarge`\n                               exception is raised.\n    :param cls: an optional dict class to use.  If this is not specified\n                       or `None` the default :class:`MultiDict` is used.\n    :param silent: If set to False parsing errors will not be caught.\n    \"\"\"\n\n    def __init__(self, stream_factory=None, charset='utf-8',\n                 errors='replace', max_form_memory_size=None,\n                 max_content_length=None, cls=None,\n                 silent=True):\n        if stream_factory is None:\n            stream_factory = default_stream_factory\n        self.stream_factory = stream_factory\n        self.charset = charset\n        self.errors = errors\n        self.max_form_memory_size = max_form_memory_size\n        self.max_content_length = max_content_length\n        if cls is None:\n            cls = MultiDict\n        self.cls = cls\n        self.silent = silent\n\n    def get_parse_func(self, mimetype, options):\n        return self.parse_functions.get(mimetype)\n\n    def parse_from_environ(self, environ):\n        \"\"\"Parses the information from the environment as form data.\n\n        :param environ: the WSGI environment to be used for parsing.\n        :return: A tuple in the form ``(stream, form, files)``.\n        \"\"\"\n        content_type = environ.get('CONTENT_TYPE', '')\n        content_length = get_content_length(environ)\n        mimetype, options = parse_options_header(content_type)\n        return self.parse(get_input_stream(environ), mimetype,\n                          content_length, options)\n\n    def parse(self, stream, mimetype, content_length, options=None):\n        \"\"\"Parses the information from the given stream, mimetype,\n        content length and mimetype parameters.\n\n        :param stream: an input stream\n        :param mimetype: the mimetype of the data\n        :param content_length: the content length of the incoming data\n        :param options: optional mimetype parameters (used for\n                        the multipart boundary for instance)\n        :return: A tuple in the form ``(stream, form, files)``.\n        \"\"\"\n        if self.max_content_length is not None and \\\n           content_length is not None and \\\n           content_length > self.max_content_length:\n            raise exceptions.RequestEntityTooLarge()\n        if options is None:\n            options = {}\n\n        parse_func = self.get_parse_func(mimetype, options)\n        if parse_func is not None:\n            try:\n                return parse_func(self, stream, mimetype,\n                                  content_length, options)\n            except ValueError:\n                if not self.silent:\n                    raise\n\n        return stream, self.cls(), self.cls()\n\n    @exhaust_stream\n    def _parse_multipart(self, stream, mimetype, content_length, options):\n        parser = MultiPartParser(self.stream_factory, self.charset, self.errors,\n                                 max_form_memory_size=self.max_form_memory_size,\n                                 cls=self.cls)\n        boundary = options.get('boundary')\n        if boundary is None:\n            raise ValueError('Missing boundary')\n        if isinstance(boundary, text_type):\n            boundary = boundary.encode('ascii')\n        form, files = parser.parse(stream, boundary, content_length)\n        return stream, form, files\n\n    @exhaust_stream\n    def _parse_urlencoded(self, stream, mimetype, content_length, options):\n        if self.max_form_memory_size is not None and \\\n           content_length is not None and \\\n           content_length > self.max_form_memory_size:\n            raise exceptions.RequestEntityTooLarge()\n        form = url_decode_stream(stream, self.charset,\n                                 errors=self.errors, cls=self.cls)\n        return stream, form, self.cls()\n\n    #: mapping of mimetypes to parsing functions\n    parse_functions = {\n        'multipart/form-data':                  _parse_multipart,\n        'application/x-www-form-urlencoded':    _parse_urlencoded,\n        'application/x-url-encoded':            _parse_urlencoded\n    }\n\n\ndef is_valid_multipart_boundary(boundary):\n    \"\"\"Checks if the string given is a valid multipart boundary.\"\"\"\n    return _multipart_boundary_re.match(boundary) is not None\n\n\ndef _line_parse(line):\n    \"\"\"Removes line ending characters and returns a tuple (`stripped_line`,\n    `is_terminated`).\n    \"\"\"\n    if line[-2:] in ['\\r\\n', b'\\r\\n']:\n        return line[:-2], True\n    elif line[-1:] in ['\\r', '\\n', b'\\r', b'\\n']:\n        return line[:-1], True\n    return line, False\n\n\ndef parse_multipart_headers(iterable):\n    \"\"\"Parses multipart headers from an iterable that yields lines (including\n    the trailing newline symbol).  The iterable has to be newline terminated.\n\n    The iterable will stop at the line where the headers ended so it can be\n    further consumed.\n\n    :param iterable: iterable of strings that are newline terminated\n    \"\"\"\n    result = []\n    for line in iterable:\n        line = to_native(line)\n        line, line_terminated = _line_parse(line)\n        if not line_terminated:\n            raise ValueError('unexpected end of line in multipart header')\n        if not line:\n            break\n        elif line[0] in ' \\t' and result:\n            key, value = result[-1]\n            result[-1] = (key, value + '\\n ' + line[1:])\n        else:\n            parts = line.split(':', 1)\n            if len(parts) == 2:\n                result.append((parts[0].strip(), parts[1].strip()))\n\n    # we link the list to the headers, no need to create a copy, the\n    # list was not shared anyways.\n    return Headers(result)\n\n\n_begin_form = 'begin_form'\n_begin_file = 'begin_file'\n_cont = 'cont'\n_end = 'end'\n\n\nclass MultiPartParser(object):\n\n    def __init__(self, stream_factory=None, charset='utf-8', errors='replace',\n                 max_form_memory_size=None, cls=None, buffer_size=64 * 1024):\n        self.stream_factory = stream_factory\n        self.charset = charset\n        self.errors = errors\n        self.max_form_memory_size = max_form_memory_size\n        if stream_factory is None:\n            stream_factory = default_stream_factory\n        if cls is None:\n            cls = MultiDict\n        self.cls = cls\n\n        # make sure the buffer size is divisible by four so that we can base64\n        # decode chunk by chunk\n        assert buffer_size % 4 == 0, 'buffer size has to be divisible by 4'\n        # also the buffer size has to be at least 1024 bytes long or long headers\n        # will freak out the system\n        assert buffer_size >= 1024, 'buffer size has to be at least 1KB'\n\n        self.buffer_size = buffer_size\n\n    def _fix_ie_filename(self, filename):\n        \"\"\"Internet Explorer 6 transmits the full file name if a file is\n        uploaded.  This function strips the full path if it thinks the\n        filename is Windows-like absolute.\n        \"\"\"\n        if filename[1:3] == ':\\\\' or filename[:2] == '\\\\\\\\':\n            return filename.split('\\\\')[-1]\n        return filename\n\n    def _find_terminator(self, iterator):\n        \"\"\"The terminator might have some additional newlines before it.\n        There is at least one application that sends additional newlines\n        before headers (the python setuptools package).\n        \"\"\"\n        for line in iterator:\n            if not line:\n                break\n            line = line.strip()\n            if line:\n                return line\n        return b''\n\n    def fail(self, message):\n        raise ValueError(message)\n\n    def get_part_encoding(self, headers):\n        transfer_encoding = headers.get('content-transfer-encoding')\n        if transfer_encoding is not None and \\\n           transfer_encoding in _supported_multipart_encodings:\n            return transfer_encoding\n\n    def get_part_charset(self, headers):\n        # Figure out input charset for current part\n        content_type = headers.get('content-type')\n        if content_type:\n            mimetype, ct_params = parse_options_header(content_type)\n            return ct_params.get('charset', self.charset)\n        return self.charset\n\n    def start_file_streaming(self, filename, headers, total_content_length):\n        if isinstance(filename, bytes):\n            filename = filename.decode(self.charset, self.errors)\n        filename = self._fix_ie_filename(filename)\n        content_type = headers.get('content-type')\n        try:\n            content_length = int(headers['content-length'])\n        except (KeyError, ValueError):\n            content_length = 0\n        container = self.stream_factory(total_content_length, content_type,\n                                        filename, content_length)\n        return filename, container\n\n    def in_memory_threshold_reached(self, bytes):\n        raise exceptions.RequestEntityTooLarge()\n\n    def validate_boundary(self, boundary):\n        if not boundary:\n            self.fail('Missing boundary')\n        if not is_valid_multipart_boundary(boundary):\n            self.fail('Invalid boundary: %s' % boundary)\n        if len(boundary) > self.buffer_size:  # pragma: no cover\n            # this should never happen because we check for a minimum size\n            # of 1024 and boundaries may not be longer than 200.  The only\n            # situation when this happens is for non debug builds where\n            # the assert is skipped.\n            self.fail('Boundary longer than buffer size')\n\n    def parse_lines(self, file, boundary, content_length):\n        \"\"\"Generate parts of\n        ``('begin_form', (headers, name))``\n        ``('begin_file', (headers, name, filename))``\n        ``('cont', bytestring)``\n        ``('end', None)``\n\n        Always obeys the grammar\n        parts = ( begin_form cont* end |\n                  begin_file cont* end )*\n        \"\"\"\n        next_part = b'--' + boundary\n        last_part = next_part + b'--'\n\n        iterator = chain(make_line_iter(file, limit=content_length,\n                                        buffer_size=self.buffer_size),\n                         _empty_string_iter)\n\n        terminator = self._find_terminator(iterator)\n\n        if terminator == last_part:\n            return\n        elif terminator != next_part:\n            self.fail('Expected boundary at start of multipart data')\n\n        while terminator != last_part:\n            headers = parse_multipart_headers(iterator)\n\n            disposition = headers.get('content-disposition')\n            if disposition is None:\n                self.fail('Missing Content-Disposition header')\n            disposition, extra = parse_options_header(disposition)\n            transfer_encoding = self.get_part_encoding(headers)\n            name = extra.get('name')\n            filename = extra.get('filename')\n\n            # if no content type is given we stream into memory.  A list is\n            # used as a temporary container.\n            if filename is None:\n                yield _begin_form, (headers, name)\n\n            # otherwise we parse the rest of the headers and ask the stream\n            # factory for something we can write in.\n            else:\n                yield _begin_file, (headers, name, filename)\n\n            buf = b''\n            for line in iterator:\n                if not line:\n                    self.fail('unexpected end of stream')\n\n                if line[:2] == b'--':\n                    terminator = line.rstrip()\n                    if terminator in (next_part, last_part):\n                        break\n\n                if transfer_encoding is not None:\n                    if transfer_encoding == 'base64':\n                        transfer_encoding = 'base64_codec'\n                    try:\n                        line = codecs.decode(line, transfer_encoding)\n                    except Exception:\n                        self.fail('could not decode transfer encoded chunk')\n\n                # we have something in the buffer from the last iteration.\n                # this is usually a newline delimiter.\n                if buf:\n                    yield _cont, buf\n                    buf = b''\n\n                # If the line ends with windows CRLF we write everything except\n                # the last two bytes.  In all other cases however we write\n                # everything except the last byte.  If it was a newline, that's\n                # fine, otherwise it does not matter because we will write it\n                # the next iteration.  this ensures we do not write the\n                # final newline into the stream.  That way we do not have to\n                # truncate the stream.  However we do have to make sure that\n                # if something else than a newline is in there we write it\n                # out.\n                if line[-2:] == b'\\r\\n':\n                    buf = b'\\r\\n'\n                    cutoff = -2\n                else:\n                    buf = line[-1:]\n                    cutoff = -1\n                yield _cont, line[:cutoff]\n\n            else:  # pragma: no cover\n                raise ValueError('unexpected end of part')\n\n            # if we have a leftover in the buffer that is not a newline\n            # character we have to flush it, otherwise we will chop of\n            # certain values.\n            if buf not in (b'', b'\\r', b'\\n', b'\\r\\n'):\n                yield _cont, buf\n\n            yield _end, None\n\n    def parse_parts(self, file, boundary, content_length):\n        \"\"\"Generate ``('file', (name, val))`` and\n        ``('form', (name, val))`` parts.\n        \"\"\"\n        in_memory = 0\n\n        for ellt, ell in self.parse_lines(file, boundary, content_length):\n            if ellt == _begin_file:\n                headers, name, filename = ell\n                is_file = True\n                guard_memory = False\n                filename, container = self.start_file_streaming(\n                    filename, headers, content_length)\n                _write = container.write\n\n            elif ellt == _begin_form:\n                headers, name = ell\n                is_file = False\n                container = []\n                _write = container.append\n                guard_memory = self.max_form_memory_size is not None\n\n            elif ellt == _cont:\n                _write(ell)\n                # if we write into memory and there is a memory size limit we\n                # count the number of bytes in memory and raise an exception if\n                # there is too much data in memory.\n                if guard_memory:\n                    in_memory += len(ell)\n                    if in_memory > self.max_form_memory_size:\n                        self.in_memory_threshold_reached(in_memory)\n\n            elif ellt == _end:\n                if is_file:\n                    container.seek(0)\n                    yield ('file',\n                           (name, FileStorage(container, filename, name,\n                                              headers=headers)))\n                else:\n                    part_charset = self.get_part_charset(headers)\n                    yield ('form',\n                           (name, b''.join(container).decode(\n                               part_charset, self.errors)))\n\n    def parse(self, file, boundary, content_length):\n        formstream, filestream = tee(\n            self.parse_parts(file, boundary, content_length), 2)\n        form = (p[1] for p in formstream if p[0] == 'form')\n        files = (p[1] for p in filestream if p[0] == 'file')\n        return self.cls(form), self.cls(files)\n\n\nfrom werkzeug import exceptions\n"
  },
  {
    "path": "lib/werkzeug/http.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    werkzeug.http\n    ~~~~~~~~~~~~~\n\n    Werkzeug comes with a bunch of utilities that help Werkzeug to deal with\n    HTTP data.  Most of the classes and functions provided by this module are\n    used by the wrappers, but they are useful on their own, too, especially if\n    the response and request objects are not used.\n\n    This covers some of the more HTTP centric features of WSGI, some other\n    utilities such as cookie handling are documented in the `werkzeug.utils`\n    module.\n\n\n    :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nimport re\nfrom time import time, gmtime\ntry:\n    from email.utils import parsedate_tz\nexcept ImportError:  # pragma: no cover\n    from email.Utils import parsedate_tz\ntry:\n    from urllib2 import parse_http_list as _parse_list_header\nexcept ImportError:  # pragma: no cover\n    from urllib.request import parse_http_list as _parse_list_header\nfrom datetime import datetime, timedelta\nfrom hashlib import md5\nimport base64\n\nfrom werkzeug._internal import _cookie_quote, _make_cookie_domain, \\\n    _cookie_parse_impl\nfrom werkzeug._compat import to_unicode, iteritems, text_type, \\\n    string_types, try_coerce_native, to_bytes, PY2, \\\n    integer_types\n\n\n_cookie_charset = 'latin1'\n# for explanation of \"media-range\", etc. see Sections 5.3.{1,2} of RFC 7231\n_accept_re = re.compile(\n    r'''(                       # media-range capturing-parenthesis\n              [^\\s;,]+              # type/subtype\n              (?:[ \\t]*;[ \\t]*      # \";\"\n                (?:                 # parameter non-capturing-parenthesis\n                  [^\\s;,q][^\\s;,]*  # token that doesn't start with \"q\"\n                |                   # or\n                  q[^\\s;,=][^\\s;,]* # token that is more than just \"q\"\n                )\n              )*                    # zero or more parameters\n            )                       # end of media-range\n            (?:[ \\t]*;[ \\t]*q=      # weight is a \"q\" parameter\n              (\\d*(?:\\.\\d+)?)       # qvalue capturing-parentheses\n              [^,]*                 # \"extension\" accept params: who cares?\n            )?                      # accept params are optional\n        ''', re.VERBOSE)\n_token_chars = frozenset(\"!#$%&'*+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n                         '^_`abcdefghijklmnopqrstuvwxyz|~')\n_etag_re = re.compile(r'([Ww]/)?(?:\"(.*?)\"|(.*?))(?:\\s*,\\s*|$)')\n_unsafe_header_chars = set('()<>@,;:\\\"/[]?={} \\t')\n_quoted_string_re = r'\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\"'\n_option_header_piece_re = re.compile(\n    r';\\s*(%s|[^\\s;,=]+)\\s*(?:=\\s*(%s|[^;,]+)?)?\\s*' %\n    (_quoted_string_re, _quoted_string_re)\n)\n_option_header_start_mime_type = re.compile(r',\\s*([^;,\\s]+)([;,]\\s*.+)?')\n\n_entity_headers = frozenset([\n    'allow', 'content-encoding', 'content-language', 'content-length',\n    'content-location', 'content-md5', 'content-range', 'content-type',\n    'expires', 'last-modified'\n])\n_hop_by_hop_headers = frozenset([\n    'connection', 'keep-alive', 'proxy-authenticate',\n    'proxy-authorization', 'te', 'trailer', 'transfer-encoding',\n    'upgrade'\n])\n\n\nHTTP_STATUS_CODES = {\n    100:    'Continue',\n    101:    'Switching Protocols',\n    102:    'Processing',\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',\n    226:    'IM Used',              # see RFC 3229\n    300:    'Multiple Choices',\n    301:    'Moved Permanently',\n    302:    'Found',\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',     # unused\n    403:    'Forbidden',\n    404:    'Not Found',\n    405:    'Method Not Allowed',\n    406:    'Not Acceptable',\n    407:    'Proxy Authentication Required',\n    408:    'Request Timeout',\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 Long',\n    415:    'Unsupported Media Type',\n    416:    'Requested Range Not Satisfiable',\n    417:    'Expectation Failed',\n    418:    'I\\'m a teapot',  # see RFC 2324\n    422:    'Unprocessable Entity',\n    423:    'Locked',\n    424:    'Failed Dependency',\n    426:    'Upgrade Required',\n    428:    'Precondition Required',  # see RFC 6585\n    429:    'Too Many Requests',\n    431:    'Request Header Fields Too Large',\n    449:    'Retry With',  # proprietary MS extension\n    500:    'Internal Server Error',\n    501:    'Not Implemented',\n    502:    'Bad Gateway',\n    503:    'Service Unavailable',\n    504:    'Gateway Timeout',\n    505:    'HTTP Version Not Supported',\n    507:    'Insufficient Storage',\n    510:    'Not Extended'\n}\n\n\ndef wsgi_to_bytes(data):\n    \"\"\"coerce wsgi unicode represented bytes to real ones\n\n    \"\"\"\n    if isinstance(data, bytes):\n        return data\n    return data.encode('latin1')  # XXX: utf8 fallback?\n\n\ndef bytes_to_wsgi(data):\n    assert isinstance(data, bytes), 'data must be bytes'\n    if isinstance(data, str):\n        return data\n    else:\n        return data.decode('latin1')\n\n\ndef quote_header_value(value, extra_chars='', allow_token=True):\n    \"\"\"Quote a header value if necessary.\n\n    .. versionadded:: 0.5\n\n    :param value: the value to quote.\n    :param extra_chars: a list of extra characters to skip quoting.\n    :param allow_token: if this is enabled token values are returned\n                        unchanged.\n    \"\"\"\n    if isinstance(value, bytes):\n        value = bytes_to_wsgi(value)\n    value = str(value)\n    if allow_token:\n        token_chars = _token_chars | set(extra_chars)\n        if set(value).issubset(token_chars):\n            return value\n    return '\"%s\"' % value.replace('\\\\', '\\\\\\\\').replace('\"', '\\\\\"')\n\n\ndef unquote_header_value(value, is_filename=False):\n    r\"\"\"Unquotes a header value.  (Reversal of :func:`quote_header_value`).\n    This does not use the real unquoting but what browsers are actually\n    using for quoting.\n\n    .. versionadded:: 0.5\n\n    :param value: the header value to unquote.\n    \"\"\"\n    if value and value[0] == value[-1] == '\"':\n        # this is not the real unquoting, but fixing this so that the\n        # RFC is met will result in bugs with internet explorer and\n        # probably some other browsers as well.  IE for example is\n        # uploading files with \"C:\\foo\\bar.txt\" as filename\n        value = value[1:-1]\n\n        # if this is a filename and the starting characters look like\n        # a UNC path, then just return the value without quotes.  Using the\n        # replace sequence below on a UNC path has the effect of turning\n        # the leading double slash into a single slash and then\n        # _fix_ie_filename() doesn't work correctly.  See #458.\n        if not is_filename or value[:2] != '\\\\\\\\':\n            return value.replace('\\\\\\\\', '\\\\').replace('\\\\\"', '\"')\n    return value\n\n\ndef dump_options_header(header, options):\n    \"\"\"The reverse function to :func:`parse_options_header`.\n\n    :param header: the header to dump\n    :param options: a dict of options to append.\n    \"\"\"\n    segments = []\n    if header is not None:\n        segments.append(header)\n    for key, value in iteritems(options):\n        if value is None:\n            segments.append(key)\n        else:\n            segments.append('%s=%s' % (key, quote_header_value(value)))\n    return '; '.join(segments)\n\n\ndef dump_header(iterable, allow_token=True):\n    \"\"\"Dump an HTTP header again.  This is the reversal of\n    :func:`parse_list_header`, :func:`parse_set_header` and\n    :func:`parse_dict_header`.  This also quotes strings that include an\n    equals sign unless you pass it as dict of key, value pairs.\n\n    >>> dump_header({'foo': 'bar baz'})\n    'foo=\"bar baz\"'\n    >>> dump_header(('foo', 'bar baz'))\n    'foo, \"bar baz\"'\n\n    :param iterable: the iterable or dict of values to quote.\n    :param allow_token: if set to `False` tokens as values are disallowed.\n                        See :func:`quote_header_value` for more details.\n    \"\"\"\n    if isinstance(iterable, dict):\n        items = []\n        for key, value in iteritems(iterable):\n            if value is None:\n                items.append(key)\n            else:\n                items.append('%s=%s' % (\n                    key,\n                    quote_header_value(value, allow_token=allow_token)\n                ))\n    else:\n        items = [quote_header_value(x, allow_token=allow_token)\n                 for x in iterable]\n    return ', '.join(items)\n\n\ndef parse_list_header(value):\n    \"\"\"Parse lists as described by RFC 2068 Section 2.\n\n    In particular, parse comma-separated lists where the elements of\n    the list may include quoted-strings.  A quoted-string could\n    contain a comma.  A non-quoted string could have quotes in the\n    middle.  Quotes are removed automatically after parsing.\n\n    It basically works like :func:`parse_set_header` just that items\n    may appear multiple times and case sensitivity is preserved.\n\n    The return value is a standard :class:`list`:\n\n    >>> parse_list_header('token, \"quoted value\"')\n    ['token', 'quoted value']\n\n    To create a header from the :class:`list` again, use the\n    :func:`dump_header` function.\n\n    :param value: a string with a list header.\n    :return: :class:`list`\n    \"\"\"\n    result = []\n    for item in _parse_list_header(value):\n        if item[:1] == item[-1:] == '\"':\n            item = unquote_header_value(item[1:-1])\n        result.append(item)\n    return result\n\n\ndef parse_dict_header(value, cls=dict):\n    \"\"\"Parse lists of key, value pairs as described by RFC 2068 Section 2 and\n    convert them into a python dict (or any other mapping object created from\n    the type with a dict like interface provided by the `cls` arugment):\n\n    >>> d = parse_dict_header('foo=\"is a fish\", bar=\"as well\"')\n    >>> type(d) is dict\n    True\n    >>> sorted(d.items())\n    [('bar', 'as well'), ('foo', 'is a fish')]\n\n    If there is no value for a key it will be `None`:\n\n    >>> parse_dict_header('key_without_value')\n    {'key_without_value': None}\n\n    To create a header from the :class:`dict` again, use the\n    :func:`dump_header` function.\n\n    .. versionchanged:: 0.9\n       Added support for `cls` argument.\n\n    :param value: a string with a dict header.\n    :param cls: callable to use for storage of parsed results.\n    :return: an instance of `cls`\n    \"\"\"\n    result = cls()\n    if not isinstance(value, text_type):\n        # XXX: validate\n        value = bytes_to_wsgi(value)\n    for item in _parse_list_header(value):\n        if '=' not in item:\n            result[item] = None\n            continue\n        name, value = item.split('=', 1)\n        if value[:1] == value[-1:] == '\"':\n            value = unquote_header_value(value[1:-1])\n        result[name] = value\n    return result\n\n\ndef parse_options_header(value, multiple=False):\n    \"\"\"Parse a ``Content-Type`` like header into a tuple with the content\n    type and the options:\n\n    >>> parse_options_header('text/html; charset=utf8')\n    ('text/html', {'charset': 'utf8'})\n\n    This should not be used to parse ``Cache-Control`` like headers that use\n    a slightly different format.  For these headers use the\n    :func:`parse_dict_header` function.\n\n    .. versionadded:: 0.5\n\n    :param value: the header to parse.\n    :param multiple: Whether try to parse and return multiple MIME types\n    :return: (mimetype, options) or (mimetype, options, mimetype, options, …)\n             if multiple=True\n    \"\"\"\n\n    if not value:\n        return '', {}\n\n    result = []\n\n    value = \",\" + value.replace(\"\\n\", \",\")\n    while value:\n        match = _option_header_start_mime_type.match(value)\n        if not match:\n            break\n        result.append(match.group(1))  # mimetype\n        options = {}\n        # Parse options\n        rest = match.group(2)\n        while rest:\n            optmatch = _option_header_piece_re.match(rest)\n            if not optmatch:\n                break\n            option, option_value = optmatch.groups()\n            option = unquote_header_value(option)\n            if option_value is not None:\n                option_value = unquote_header_value(\n                    option_value,\n                    option == 'filename')\n            options[option] = option_value\n            rest = rest[optmatch.end():]\n        result.append(options)\n        if multiple is False:\n            return tuple(result)\n        value = rest\n\n    return tuple(result)\n\n\ndef parse_accept_header(value, cls=None):\n    \"\"\"Parses an HTTP Accept-* header.  This does not implement a complete\n    valid algorithm but one that supports at least value and quality\n    extraction.\n\n    Returns a new :class:`Accept` object (basically a list of ``(value, quality)``\n    tuples sorted by the quality with some additional accessor methods).\n\n    The second parameter can be a subclass of :class:`Accept` that is created\n    with the parsed values and returned.\n\n    :param value: the accept header string to be parsed.\n    :param cls: the wrapper class for the return value (can be\n                         :class:`Accept` or a subclass thereof)\n    :return: an instance of `cls`.\n    \"\"\"\n    if cls is None:\n        cls = Accept\n\n    if not value:\n        return cls(None)\n\n    result = []\n    for match in _accept_re.finditer(value):\n        quality = match.group(2)\n        if not quality:\n            quality = 1\n        else:\n            quality = max(min(float(quality), 1), 0)\n        result.append((match.group(1), quality))\n    return cls(result)\n\n\ndef parse_cache_control_header(value, on_update=None, cls=None):\n    \"\"\"Parse a cache control header.  The RFC differs between response and\n    request cache control, this method does not.  It's your responsibility\n    to not use the wrong control statements.\n\n    .. versionadded:: 0.5\n       The `cls` was added.  If not specified an immutable\n       :class:`~werkzeug.datastructures.RequestCacheControl` is returned.\n\n    :param value: a cache control header to be parsed.\n    :param on_update: an optional callable that is called every time a value\n                      on the :class:`~werkzeug.datastructures.CacheControl`\n                      object is changed.\n    :param cls: the class for the returned object.  By default\n                :class:`~werkzeug.datastructures.RequestCacheControl` is used.\n    :return: a `cls` object.\n    \"\"\"\n    if cls is None:\n        cls = RequestCacheControl\n    if not value:\n        return cls(None, on_update)\n    return cls(parse_dict_header(value), on_update)\n\n\ndef parse_set_header(value, on_update=None):\n    \"\"\"Parse a set-like header and return a\n    :class:`~werkzeug.datastructures.HeaderSet` object:\n\n    >>> hs = parse_set_header('token, \"quoted value\"')\n\n    The return value is an object that treats the items case-insensitively\n    and keeps the order of the items:\n\n    >>> 'TOKEN' in hs\n    True\n    >>> hs.index('quoted value')\n    1\n    >>> hs\n    HeaderSet(['token', 'quoted value'])\n\n    To create a header from the :class:`HeaderSet` again, use the\n    :func:`dump_header` function.\n\n    :param value: a set header to be parsed.\n    :param on_update: an optional callable that is called every time a\n                      value on the :class:`~werkzeug.datastructures.HeaderSet`\n                      object is changed.\n    :return: a :class:`~werkzeug.datastructures.HeaderSet`\n    \"\"\"\n    if not value:\n        return HeaderSet(None, on_update)\n    return HeaderSet(parse_list_header(value), on_update)\n\n\ndef parse_authorization_header(value):\n    \"\"\"Parse an HTTP basic/digest authorization header transmitted by the web\n    browser.  The return value is either `None` if the header was invalid or\n    not given, otherwise an :class:`~werkzeug.datastructures.Authorization`\n    object.\n\n    :param value: the authorization header to parse.\n    :return: a :class:`~werkzeug.datastructures.Authorization` object or `None`.\n    \"\"\"\n    if not value:\n        return\n    value = wsgi_to_bytes(value)\n    try:\n        auth_type, auth_info = value.split(None, 1)\n        auth_type = auth_type.lower()\n    except ValueError:\n        return\n    if auth_type == b'basic':\n        try:\n            username, password = base64.b64decode(auth_info).split(b':', 1)\n        except Exception:\n            return\n        return Authorization('basic', {'username':  bytes_to_wsgi(username),\n                                       'password': bytes_to_wsgi(password)})\n    elif auth_type == b'digest':\n        auth_map = parse_dict_header(auth_info)\n        for key in 'username', 'realm', 'nonce', 'uri', 'response':\n            if key not in auth_map:\n                return\n        if 'qop' in auth_map:\n            if not auth_map.get('nc') or not auth_map.get('cnonce'):\n                return\n        return Authorization('digest', auth_map)\n\n\ndef parse_www_authenticate_header(value, on_update=None):\n    \"\"\"Parse an HTTP WWW-Authenticate header into a\n    :class:`~werkzeug.datastructures.WWWAuthenticate` object.\n\n    :param value: a WWW-Authenticate header to parse.\n    :param on_update: an optional callable that is called every time a value\n                      on the :class:`~werkzeug.datastructures.WWWAuthenticate`\n                      object is changed.\n    :return: a :class:`~werkzeug.datastructures.WWWAuthenticate` object.\n    \"\"\"\n    if not value:\n        return WWWAuthenticate(on_update=on_update)\n    try:\n        auth_type, auth_info = value.split(None, 1)\n        auth_type = auth_type.lower()\n    except (ValueError, AttributeError):\n        return WWWAuthenticate(value.strip().lower(), on_update=on_update)\n    return WWWAuthenticate(auth_type, parse_dict_header(auth_info),\n                           on_update)\n\n\ndef parse_if_range_header(value):\n    \"\"\"Parses an if-range header which can be an etag or a date.  Returns\n    a :class:`~werkzeug.datastructures.IfRange` object.\n\n    .. versionadded:: 0.7\n    \"\"\"\n    if not value:\n        return IfRange()\n    date = parse_date(value)\n    if date is not None:\n        return IfRange(date=date)\n    # drop weakness information\n    return IfRange(unquote_etag(value)[0])\n\n\ndef parse_range_header(value, make_inclusive=True):\n    \"\"\"Parses a range header into a :class:`~werkzeug.datastructures.Range`\n    object.  If the header is missing or malformed `None` is returned.\n    `ranges` is a list of ``(start, stop)`` tuples where the ranges are\n    non-inclusive.\n\n    .. versionadded:: 0.7\n    \"\"\"\n    if not value or '=' not in value:\n        return None\n\n    ranges = []\n    last_end = 0\n    units, rng = value.split('=', 1)\n    units = units.strip().lower()\n\n    for item in rng.split(','):\n        item = item.strip()\n        if '-' not in item:\n            return None\n        if item.startswith('-'):\n            if last_end < 0:\n                return None\n            begin = int(item)\n            end = None\n            last_end = -1\n        elif '-' in item:\n            begin, end = item.split('-', 1)\n            begin = int(begin)\n            if begin < last_end or last_end < 0:\n                return None\n            if end:\n                end = int(end) + 1\n                if begin >= end:\n                    return None\n            else:\n                end = None\n            last_end = end\n        ranges.append((begin, end))\n\n    return Range(units, ranges)\n\n\ndef parse_content_range_header(value, on_update=None):\n    \"\"\"Parses a range header into a\n    :class:`~werkzeug.datastructures.ContentRange` object or `None` if\n    parsing is not possible.\n\n    .. versionadded:: 0.7\n\n    :param value: a content range header to be parsed.\n    :param on_update: an optional callable that is called every time a value\n                      on the :class:`~werkzeug.datastructures.ContentRange`\n                      object is changed.\n    \"\"\"\n    if value is None:\n        return None\n    try:\n        units, rangedef = (value or '').strip().split(None, 1)\n    except ValueError:\n        return None\n\n    if '/' not in rangedef:\n        return None\n    rng, length = rangedef.split('/', 1)\n    if length == '*':\n        length = None\n    elif length.isdigit():\n        length = int(length)\n    else:\n        return None\n\n    if rng == '*':\n        return ContentRange(units, None, None, length, on_update=on_update)\n    elif '-' not in rng:\n        return None\n\n    start, stop = rng.split('-', 1)\n    try:\n        start = int(start)\n        stop = int(stop) + 1\n    except ValueError:\n        return None\n\n    if is_byte_range_valid(start, stop, length):\n        return ContentRange(units, start, stop, length, on_update=on_update)\n\n\ndef quote_etag(etag, weak=False):\n    \"\"\"Quote an etag.\n\n    :param etag: the etag to quote.\n    :param weak: set to `True` to tag it \"weak\".\n    \"\"\"\n    if '\"' in etag:\n        raise ValueError('invalid etag')\n    etag = '\"%s\"' % etag\n    if weak:\n        etag = 'w/' + etag\n    return etag\n\n\ndef unquote_etag(etag):\n    \"\"\"Unquote a single etag:\n\n    >>> unquote_etag('w/\"bar\"')\n    ('bar', True)\n    >>> unquote_etag('\"bar\"')\n    ('bar', False)\n\n    :param etag: the etag identifier to unquote.\n    :return: a ``(etag, weak)`` tuple.\n    \"\"\"\n    if not etag:\n        return None, None\n    etag = etag.strip()\n    weak = False\n    if etag[:2] in ('w/', 'W/'):\n        weak = True\n        etag = etag[2:]\n    if etag[:1] == etag[-1:] == '\"':\n        etag = etag[1:-1]\n    return etag, weak\n\n\ndef parse_etags(value):\n    \"\"\"Parse an etag header.\n\n    :param value: the tag header to parse\n    :return: an :class:`~werkzeug.datastructures.ETags` object.\n    \"\"\"\n    if not value:\n        return ETags()\n    strong = []\n    weak = []\n    end = len(value)\n    pos = 0\n    while pos < end:\n        match = _etag_re.match(value, pos)\n        if match is None:\n            break\n        is_weak, quoted, raw = match.groups()\n        if raw == '*':\n            return ETags(star_tag=True)\n        elif quoted:\n            raw = quoted\n        if is_weak:\n            weak.append(raw)\n        else:\n            strong.append(raw)\n        pos = match.end()\n    return ETags(strong, weak)\n\n\ndef generate_etag(data):\n    \"\"\"Generate an etag for some data.\"\"\"\n    return md5(data).hexdigest()\n\n\ndef parse_date(value):\n    \"\"\"Parse one of the following date formats into a datetime object:\n\n    .. sourcecode:: text\n\n        Sun, 06 Nov 1994 08:49:37 GMT  ; RFC 822, updated by RFC 1123\n        Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036\n        Sun Nov  6 08:49:37 1994       ; ANSI C's asctime() format\n\n    If parsing fails the return value is `None`.\n\n    :param value: a string with a supported date format.\n    :return: a :class:`datetime.datetime` object.\n    \"\"\"\n    if value:\n        t = parsedate_tz(value.strip())\n        if t is not None:\n            try:\n                year = t[0]\n                # unfortunately that function does not tell us if two digit\n                # years were part of the string, or if they were prefixed\n                # with two zeroes.  So what we do is to assume that 69-99\n                # refer to 1900, and everything below to 2000\n                if year >= 0 and year <= 68:\n                    year += 2000\n                elif year >= 69 and year <= 99:\n                    year += 1900\n                return datetime(*((year,) + t[1:7])) - \\\n                    timedelta(seconds=t[-1] or 0)\n            except (ValueError, OverflowError):\n                return None\n\n\ndef _dump_date(d, delim):\n    \"\"\"Used for `http_date` and `cookie_date`.\"\"\"\n    if d is None:\n        d = gmtime()\n    elif isinstance(d, datetime):\n        d = d.utctimetuple()\n    elif isinstance(d, (integer_types, float)):\n        d = gmtime(d)\n    return '%s, %02d%s%s%s%s %02d:%02d:%02d GMT' % (\n        ('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun')[d.tm_wday],\n        d.tm_mday, delim,\n        ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',\n         'Oct', 'Nov', 'Dec')[d.tm_mon - 1],\n        delim, str(d.tm_year), d.tm_hour, d.tm_min, d.tm_sec\n    )\n\n\ndef cookie_date(expires=None):\n    \"\"\"Formats the time to ensure compatibility with Netscape's cookie\n    standard.\n\n    Accepts a floating point number expressed in seconds since the epoch in, a\n    datetime object or a timetuple.  All times in UTC.  The :func:`parse_date`\n    function can be used to parse such a date.\n\n    Outputs a string in the format ``Wdy, DD-Mon-YYYY HH:MM:SS GMT``.\n\n    :param expires: If provided that date is used, otherwise the current.\n    \"\"\"\n    return _dump_date(expires, '-')\n\n\ndef http_date(timestamp=None):\n    \"\"\"Formats the time to match the RFC1123 date format.\n\n    Accepts a floating point number expressed in seconds since the epoch in, a\n    datetime object or a timetuple.  All times in UTC.  The :func:`parse_date`\n    function can be used to parse such a date.\n\n    Outputs a string in the format ``Wdy, DD Mon YYYY HH:MM:SS GMT``.\n\n    :param timestamp: If provided that date is used, otherwise the current.\n    \"\"\"\n    return _dump_date(timestamp, ' ')\n\n\ndef is_resource_modified(environ, etag=None, data=None, last_modified=None):\n    \"\"\"Convenience method for conditional requests.\n\n    :param environ: the WSGI environment of the request to be checked.\n    :param etag: the etag for the response for comparison.\n    :param data: or alternatively the data of the response to automatically\n                 generate an etag using :func:`generate_etag`.\n    :param last_modified: an optional date of the last modification.\n    :return: `True` if the resource was modified, otherwise `False`.\n    \"\"\"\n    if etag is None and data is not None:\n        etag = generate_etag(data)\n    elif data is not None:\n        raise TypeError('both data and etag given')\n    if environ['REQUEST_METHOD'] not in ('GET', 'HEAD'):\n        return False\n\n    unmodified = False\n    if isinstance(last_modified, string_types):\n        last_modified = parse_date(last_modified)\n\n    # ensure that microsecond is zero because the HTTP spec does not transmit\n    # that either and we might have some false positives.  See issue #39\n    if last_modified is not None:\n        last_modified = last_modified.replace(microsecond=0)\n\n    modified_since = parse_date(environ.get('HTTP_IF_MODIFIED_SINCE'))\n\n    if modified_since and last_modified and last_modified <= modified_since:\n        unmodified = True\n    if etag:\n        if_none_match = parse_etags(environ.get('HTTP_IF_NONE_MATCH'))\n        if if_none_match:\n            unmodified = if_none_match.contains_raw(etag)\n\n    return not unmodified\n\n\ndef remove_entity_headers(headers, allowed=('expires', 'content-location')):\n    \"\"\"Remove all entity headers from a list or :class:`Headers` object.  This\n    operation works in-place.  `Expires` and `Content-Location` headers are\n    by default not removed.  The reason for this is :rfc:`2616` section\n    10.3.5 which specifies some entity headers that should be sent.\n\n    .. versionchanged:: 0.5\n       added `allowed` parameter.\n\n    :param headers: a list or :class:`Headers` object.\n    :param allowed: a list of headers that should still be allowed even though\n                    they are entity headers.\n    \"\"\"\n    allowed = set(x.lower() for x in allowed)\n    headers[:] = [(key, value) for key, value in headers if\n                  not is_entity_header(key) or key.lower() in allowed]\n\n\ndef remove_hop_by_hop_headers(headers):\n    \"\"\"Remove all HTTP/1.1 \"Hop-by-Hop\" headers from a list or\n    :class:`Headers` object.  This operation works in-place.\n\n    .. versionadded:: 0.5\n\n    :param headers: a list or :class:`Headers` object.\n    \"\"\"\n    headers[:] = [(key, value) for key, value in headers if\n                  not is_hop_by_hop_header(key)]\n\n\ndef is_entity_header(header):\n    \"\"\"Check if a header is an entity header.\n\n    .. versionadded:: 0.5\n\n    :param header: the header to test.\n    :return: `True` if it's an entity header, `False` otherwise.\n    \"\"\"\n    return header.lower() in _entity_headers\n\n\ndef is_hop_by_hop_header(header):\n    \"\"\"Check if a header is an HTTP/1.1 \"Hop-by-Hop\" header.\n\n    .. versionadded:: 0.5\n\n    :param header: the header to test.\n    :return: `True` if it's an entity header, `False` otherwise.\n    \"\"\"\n    return header.lower() in _hop_by_hop_headers\n\n\ndef parse_cookie(header, charset='utf-8', errors='replace', cls=None):\n    \"\"\"Parse a cookie.  Either from a string or WSGI environ.\n\n    Per default encoding errors are ignored.  If you want a different behavior\n    you can set `errors` to ``'replace'`` or ``'strict'``.  In strict mode a\n    :exc:`HTTPUnicodeError` is raised.\n\n    .. versionchanged:: 0.5\n       This function now returns a :class:`TypeConversionDict` instead of a\n       regular dict.  The `cls` parameter was added.\n\n    :param header: the header to be used to parse the cookie.  Alternatively\n                   this can be a WSGI environment.\n    :param charset: the charset for the cookie values.\n    :param errors: the error behavior for the charset decoding.\n    :param cls: an optional dict class to use.  If this is not specified\n                       or `None` the default :class:`TypeConversionDict` is\n                       used.\n    \"\"\"\n    if isinstance(header, dict):\n        header = header.get('HTTP_COOKIE', '')\n    elif header is None:\n        header = ''\n\n    # If the value is an unicode string it's mangled through latin1.  This\n    # is done because on PEP 3333 on Python 3 all headers are assumed latin1\n    # which however is incorrect for cookies, which are sent in page encoding.\n    # As a result we\n    if isinstance(header, text_type):\n        header = header.encode('latin1', 'replace')\n\n    if cls is None:\n        cls = TypeConversionDict\n\n    def _parse_pairs():\n        for key, val in _cookie_parse_impl(header):\n            key = to_unicode(key, charset, errors, allow_none_charset=True)\n            val = to_unicode(val, charset, errors, allow_none_charset=True)\n            yield try_coerce_native(key), val\n\n    return cls(_parse_pairs())\n\n\ndef dump_cookie(key, value='', max_age=None, expires=None, path='/',\n                domain=None, secure=False, httponly=False,\n                charset='utf-8', sync_expires=True):\n    \"\"\"Creates a new Set-Cookie header without the ``Set-Cookie`` prefix\n    The parameters are the same as in the cookie Morsel object in the\n    Python standard library but it accepts unicode data, too.\n\n    On Python 3 the return value of this function will be a unicode\n    string, on Python 2 it will be a native string.  In both cases the\n    return value is usually restricted to ascii as the vast majority of\n    values are properly escaped, but that is no guarantee.  If a unicode\n    string is returned it's tunneled through latin1 as required by\n    PEP 3333.\n\n    The return value is not ASCII safe if the key contains unicode\n    characters.  This is technically against the specification but\n    happens in the wild.  It's strongly recommended to not use\n    non-ASCII values for the keys.\n\n    :param max_age: should be a number of seconds, or `None` (default) if\n                    the cookie should last only as long as the client's\n                    browser session.  Additionally `timedelta` objects\n                    are accepted, too.\n    :param expires: should be a `datetime` object or unix timestamp.\n    :param path: limits the cookie to a given path, per default it will\n                 span the whole domain.\n    :param domain: Use this if you want to set a cross-domain cookie. For\n                   example, ``domain=\".example.com\"`` will set a cookie\n                   that is readable by the domain ``www.example.com``,\n                   ``foo.example.com`` etc. Otherwise, a cookie will only\n                   be readable by the domain that set it.\n    :param secure: The cookie will only be available via HTTPS\n    :param httponly: disallow JavaScript to access the cookie.  This is an\n                     extension to the cookie standard and probably not\n                     supported by all browsers.\n    :param charset: the encoding for unicode values.\n    :param sync_expires: automatically set expires if max_age is defined\n                         but expires not.\n    \"\"\"\n    key = to_bytes(key, charset)\n    value = to_bytes(value, charset)\n\n    if path is not None:\n        path = iri_to_uri(path, charset)\n    domain = _make_cookie_domain(domain)\n    if isinstance(max_age, timedelta):\n        max_age = (max_age.days * 60 * 60 * 24) + max_age.seconds\n    if expires is not None:\n        if not isinstance(expires, string_types):\n            expires = cookie_date(expires)\n    elif max_age is not None and sync_expires:\n        expires = to_bytes(cookie_date(time() + max_age))\n\n    buf = [key + b'=' + _cookie_quote(value)]\n\n    # XXX: In theory all of these parameters that are not marked with `None`\n    # should be quoted.  Because stdlib did not quote it before I did not\n    # want to introduce quoting there now.\n    for k, v, q in ((b'Domain', domain, True),\n                    (b'Expires', expires, False,),\n                    (b'Max-Age', max_age, False),\n                    (b'Secure', secure, None),\n                    (b'HttpOnly', httponly, None),\n                    (b'Path', path, False)):\n        if q is None:\n            if v:\n                buf.append(k)\n            continue\n\n        if v is None:\n            continue\n\n        tmp = bytearray(k)\n        if not isinstance(v, (bytes, bytearray)):\n            v = to_bytes(text_type(v), charset)\n        if q:\n            v = _cookie_quote(v)\n        tmp += b'=' + v\n        buf.append(bytes(tmp))\n\n    # The return value will be an incorrectly encoded latin1 header on\n    # Python 3 for consistency with the headers object and a bytestring\n    # on Python 2 because that's how the API makes more sense.\n    rv = b'; '.join(buf)\n    if not PY2:\n        rv = rv.decode('latin1')\n    return rv\n\n\ndef is_byte_range_valid(start, stop, length):\n    \"\"\"Checks if a given byte content range is valid for the given length.\n\n    .. versionadded:: 0.7\n    \"\"\"\n    if (start is None) != (stop is None):\n        return False\n    elif start is None:\n        return length is None or length >= 0\n    elif length is None:\n        return 0 <= start < stop\n    elif start >= stop:\n        return False\n    return 0 <= start < length\n\n\n# circular dependency fun\nfrom werkzeug.datastructures import Accept, HeaderSet, ETags, Authorization, \\\n    WWWAuthenticate, TypeConversionDict, IfRange, Range, ContentRange, \\\n    RequestCacheControl\n\n\n# DEPRECATED\n# backwards compatible imports\nfrom werkzeug.datastructures import (  # noqa\n    MIMEAccept, CharsetAccept, LanguageAccept, Headers\n)\nfrom werkzeug.urls import iri_to_uri\n"
  },
  {
    "path": "lib/werkzeug/local.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    werkzeug.local\n    ~~~~~~~~~~~~~~\n\n    This module implements context-local objects.\n\n    :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nfrom functools import update_wrapper\nfrom werkzeug.wsgi import ClosingIterator\nfrom werkzeug._compat import PY2, implements_bool\n\n# since each thread has its own greenlet we can just use those as identifiers\n# for the context.  If greenlets are not available we fall back to the\n# current thread ident depending on where it is.\ntry:\n    from greenlet import getcurrent as get_ident\nexcept ImportError:\n    try:\n        from thread import get_ident\n    except ImportError:\n        from _thread import get_ident\n\n\ndef release_local(local):\n    \"\"\"Releases the contents of the local for the current context.\n    This makes it possible to use locals without a manager.\n\n    Example::\n\n        >>> loc = Local()\n        >>> loc.foo = 42\n        >>> release_local(loc)\n        >>> hasattr(loc, 'foo')\n        False\n\n    With this function one can release :class:`Local` objects as well\n    as :class:`LocalStack` objects.  However it is not possible to\n    release data held by proxies that way, one always has to retain\n    a reference to the underlying local object in order to be able\n    to release it.\n\n    .. versionadded:: 0.6.1\n    \"\"\"\n    local.__release_local__()\n\n\nclass Local(object):\n    __slots__ = ('__storage__', '__ident_func__')\n\n    def __init__(self):\n        object.__setattr__(self, '__storage__', {})\n        object.__setattr__(self, '__ident_func__', get_ident)\n\n    def __iter__(self):\n        return iter(self.__storage__.items())\n\n    def __call__(self, proxy):\n        \"\"\"Create a proxy for a name.\"\"\"\n        return LocalProxy(self, proxy)\n\n    def __release_local__(self):\n        self.__storage__.pop(self.__ident_func__(), None)\n\n    def __getattr__(self, name):\n        try:\n            return self.__storage__[self.__ident_func__()][name]\n        except KeyError:\n            raise AttributeError(name)\n\n    def __setattr__(self, name, value):\n        ident = self.__ident_func__()\n        storage = self.__storage__\n        try:\n            storage[ident][name] = value\n        except KeyError:\n            storage[ident] = {name: value}\n\n    def __delattr__(self, name):\n        try:\n            del self.__storage__[self.__ident_func__()][name]\n        except KeyError:\n            raise AttributeError(name)\n\n\nclass LocalStack(object):\n\n    \"\"\"This class works similar to a :class:`Local` but keeps a stack\n    of objects instead.  This is best explained with an example::\n\n        >>> ls = LocalStack()\n        >>> ls.push(42)\n        >>> ls.top\n        42\n        >>> ls.push(23)\n        >>> ls.top\n        23\n        >>> ls.pop()\n        23\n        >>> ls.top\n        42\n\n    They can be force released by using a :class:`LocalManager` or with\n    the :func:`release_local` function but the correct way is to pop the\n    item from the stack after using.  When the stack is empty it will\n    no longer be bound to the current context (and as such released).\n\n    By calling the stack without arguments it returns a proxy that resolves to\n    the topmost item on the stack.\n\n    .. versionadded:: 0.6.1\n    \"\"\"\n\n    def __init__(self):\n        self._local = Local()\n\n    def __release_local__(self):\n        self._local.__release_local__()\n\n    def _get__ident_func__(self):\n        return self._local.__ident_func__\n\n    def _set__ident_func__(self, value):\n        object.__setattr__(self._local, '__ident_func__', value)\n    __ident_func__ = property(_get__ident_func__, _set__ident_func__)\n    del _get__ident_func__, _set__ident_func__\n\n    def __call__(self):\n        def _lookup():\n            rv = self.top\n            if rv is None:\n                raise RuntimeError('object unbound')\n            return rv\n        return LocalProxy(_lookup)\n\n    def push(self, obj):\n        \"\"\"Pushes a new item to the stack\"\"\"\n        rv = getattr(self._local, 'stack', None)\n        if rv is None:\n            self._local.stack = rv = []\n        rv.append(obj)\n        return rv\n\n    def pop(self):\n        \"\"\"Removes the topmost item from the stack, will return the\n        old value or `None` if the stack was already empty.\n        \"\"\"\n        stack = getattr(self._local, 'stack', None)\n        if stack is None:\n            return None\n        elif len(stack) == 1:\n            release_local(self._local)\n            return stack[-1]\n        else:\n            return stack.pop()\n\n    @property\n    def top(self):\n        \"\"\"The topmost item on the stack.  If the stack is empty,\n        `None` is returned.\n        \"\"\"\n        try:\n            return self._local.stack[-1]\n        except (AttributeError, IndexError):\n            return None\n\n\nclass LocalManager(object):\n\n    \"\"\"Local objects cannot manage themselves. For that you need a local\n    manager.  You can pass a local manager multiple locals or add them later\n    by appending them to `manager.locals`.  Everytime the manager cleans up\n    it, will clean up all the data left in the locals for this context.\n\n    The `ident_func` parameter can be added to override the default ident\n    function for the wrapped locals.\n\n    .. versionchanged:: 0.6.1\n       Instead of a manager the :func:`release_local` function can be used\n       as well.\n\n    .. versionchanged:: 0.7\n       `ident_func` was added.\n    \"\"\"\n\n    def __init__(self, locals=None, ident_func=None):\n        if locals is None:\n            self.locals = []\n        elif isinstance(locals, Local):\n            self.locals = [locals]\n        else:\n            self.locals = list(locals)\n        if ident_func is not None:\n            self.ident_func = ident_func\n            for local in self.locals:\n                object.__setattr__(local, '__ident_func__', ident_func)\n        else:\n            self.ident_func = get_ident\n\n    def get_ident(self):\n        \"\"\"Return the context identifier the local objects use internally for\n        this context.  You cannot override this method to change the behavior\n        but use it to link other context local objects (such as SQLAlchemy's\n        scoped sessions) to the Werkzeug locals.\n\n        .. versionchanged:: 0.7\n           You can pass a different ident function to the local manager that\n           will then be propagated to all the locals passed to the\n           constructor.\n        \"\"\"\n        return self.ident_func()\n\n    def cleanup(self):\n        \"\"\"Manually clean up the data in the locals for this context.  Call\n        this at the end of the request or use `make_middleware()`.\n        \"\"\"\n        for local in self.locals:\n            release_local(local)\n\n    def make_middleware(self, app):\n        \"\"\"Wrap a WSGI application so that cleaning up happens after\n        request end.\n        \"\"\"\n        def application(environ, start_response):\n            return ClosingIterator(app(environ, start_response), self.cleanup)\n        return application\n\n    def middleware(self, func):\n        \"\"\"Like `make_middleware` but for decorating functions.\n\n        Example usage::\n\n            @manager.middleware\n            def application(environ, start_response):\n                ...\n\n        The difference to `make_middleware` is that the function passed\n        will have all the arguments copied from the inner application\n        (name, docstring, module).\n        \"\"\"\n        return update_wrapper(self.make_middleware(func), func)\n\n    def __repr__(self):\n        return '<%s storages: %d>' % (\n            self.__class__.__name__,\n            len(self.locals)\n        )\n\n\n@implements_bool\nclass LocalProxy(object):\n\n    \"\"\"Acts as a proxy for a werkzeug local.  Forwards all operations to\n    a proxied object.  The only operations not supported for forwarding\n    are right handed operands and any kind of assignment.\n\n    Example usage::\n\n        from werkzeug.local import Local\n        l = Local()\n\n        # these are proxies\n        request = l('request')\n        user = l('user')\n\n\n        from werkzeug.local import LocalStack\n        _response_local = LocalStack()\n\n        # this is a proxy\n        response = _response_local()\n\n    Whenever something is bound to l.user / l.request the proxy objects\n    will forward all operations.  If no object is bound a :exc:`RuntimeError`\n    will be raised.\n\n    To create proxies to :class:`Local` or :class:`LocalStack` objects,\n    call the object as shown above.  If you want to have a proxy to an\n    object looked up by a function, you can (as of Werkzeug 0.6.1) pass\n    a function to the :class:`LocalProxy` constructor::\n\n        session = LocalProxy(lambda: get_current_request().session)\n\n    .. versionchanged:: 0.6.1\n       The class can be instanciated with a callable as well now.\n    \"\"\"\n    __slots__ = ('__local', '__dict__', '__name__')\n\n    def __init__(self, local, name=None):\n        object.__setattr__(self, '_LocalProxy__local', local)\n        object.__setattr__(self, '__name__', name)\n\n    def _get_current_object(self):\n        \"\"\"Return the current object.  This is useful if you want the real\n        object behind the proxy at a time for performance reasons or because\n        you want to pass the object into a different context.\n        \"\"\"\n        if not hasattr(self.__local, '__release_local__'):\n            return self.__local()\n        try:\n            return getattr(self.__local, self.__name__)\n        except AttributeError:\n            raise RuntimeError('no object bound to %s' % self.__name__)\n\n    @property\n    def __dict__(self):\n        try:\n            return self._get_current_object().__dict__\n        except RuntimeError:\n            raise AttributeError('__dict__')\n\n    def __repr__(self):\n        try:\n            obj = self._get_current_object()\n        except RuntimeError:\n            return '<%s unbound>' % self.__class__.__name__\n        return repr(obj)\n\n    def __bool__(self):\n        try:\n            return bool(self._get_current_object())\n        except RuntimeError:\n            return False\n\n    def __unicode__(self):\n        try:\n            return unicode(self._get_current_object())  # noqa\n        except RuntimeError:\n            return repr(self)\n\n    def __dir__(self):\n        try:\n            return dir(self._get_current_object())\n        except RuntimeError:\n            return []\n\n    def __getattr__(self, name):\n        if name == '__members__':\n            return dir(self._get_current_object())\n        return getattr(self._get_current_object(), name)\n\n    def __setitem__(self, key, value):\n        self._get_current_object()[key] = value\n\n    def __delitem__(self, key):\n        del self._get_current_object()[key]\n\n    if PY2:\n        __getslice__ = lambda x, i, j: x._get_current_object()[i:j]\n\n        def __setslice__(self, i, j, seq):\n            self._get_current_object()[i:j] = seq\n\n        def __delslice__(self, i, j):\n            del self._get_current_object()[i:j]\n\n    __setattr__ = lambda x, n, v: setattr(x._get_current_object(), n, v)\n    __delattr__ = lambda x, n: delattr(x._get_current_object(), n)\n    __str__ = lambda x: str(x._get_current_object())\n    __lt__ = lambda x, o: x._get_current_object() < o\n    __le__ = lambda x, o: x._get_current_object() <= o\n    __eq__ = lambda x, o: x._get_current_object() == o\n    __ne__ = lambda x, o: x._get_current_object() != o\n    __gt__ = lambda x, o: x._get_current_object() > o\n    __ge__ = lambda x, o: x._get_current_object() >= o\n    __cmp__ = lambda x, o: cmp(x._get_current_object(), o)  # noqa\n    __hash__ = lambda x: hash(x._get_current_object())\n    __call__ = lambda x, *a, **kw: x._get_current_object()(*a, **kw)\n    __len__ = lambda x: len(x._get_current_object())\n    __getitem__ = lambda x, i: x._get_current_object()[i]\n    __iter__ = lambda x: iter(x._get_current_object())\n    __contains__ = lambda x, i: i in x._get_current_object()\n    __add__ = lambda x, o: x._get_current_object() + o\n    __sub__ = lambda x, o: x._get_current_object() - o\n    __mul__ = lambda x, o: x._get_current_object() * o\n    __floordiv__ = lambda x, o: x._get_current_object() // o\n    __mod__ = lambda x, o: x._get_current_object() % o\n    __divmod__ = lambda x, o: x._get_current_object().__divmod__(o)\n    __pow__ = lambda x, o: x._get_current_object() ** o\n    __lshift__ = lambda x, o: x._get_current_object() << o\n    __rshift__ = lambda x, o: x._get_current_object() >> o\n    __and__ = lambda x, o: x._get_current_object() & o\n    __xor__ = lambda x, o: x._get_current_object() ^ o\n    __or__ = lambda x, o: x._get_current_object() | o\n    __div__ = lambda x, o: x._get_current_object().__div__(o)\n    __truediv__ = lambda x, o: x._get_current_object().__truediv__(o)\n    __neg__ = lambda x: -(x._get_current_object())\n    __pos__ = lambda x: +(x._get_current_object())\n    __abs__ = lambda x: abs(x._get_current_object())\n    __invert__ = lambda x: ~(x._get_current_object())\n    __complex__ = lambda x: complex(x._get_current_object())\n    __int__ = lambda x: int(x._get_current_object())\n    __long__ = lambda x: long(x._get_current_object())  # noqa\n    __float__ = lambda x: float(x._get_current_object())\n    __oct__ = lambda x: oct(x._get_current_object())\n    __hex__ = lambda x: hex(x._get_current_object())\n    __index__ = lambda x: x._get_current_object().__index__()\n    __coerce__ = lambda x, o: x._get_current_object().__coerce__(x, o)\n    __enter__ = lambda x: x._get_current_object().__enter__()\n    __exit__ = lambda x, *a, **kw: x._get_current_object().__exit__(*a, **kw)\n    __radd__ = lambda x, o: o + x._get_current_object()\n    __rsub__ = lambda x, o: o - x._get_current_object()\n    __rmul__ = lambda x, o: o * x._get_current_object()\n    __rdiv__ = lambda x, o: o / x._get_current_object()\n    if PY2:\n        __rtruediv__ = lambda x, o: x._get_current_object().__rtruediv__(o)\n    else:\n        __rtruediv__ = __rdiv__\n    __rfloordiv__ = lambda x, o: o // x._get_current_object()\n    __rmod__ = lambda x, o: o % x._get_current_object()\n    __rdivmod__ = lambda x, o: x._get_current_object().__rdivmod__(o)\n"
  },
  {
    "path": "lib/werkzeug/posixemulation.py",
    "content": "# -*- coding: utf-8 -*-\nr\"\"\"\n    werkzeug.posixemulation\n    ~~~~~~~~~~~~~~~~~~~~~~~\n\n    Provides a POSIX emulation for some features that are relevant to\n    web applications.  The main purpose is to simplify support for\n    systems such as Windows NT that are not 100% POSIX compatible.\n\n    Currently this only implements a :func:`rename` function that\n    follows POSIX semantics.  Eg: if the target file already exists it\n    will be replaced without asking.\n\n    This module was introduced in 0.6.1 and is not a public interface.\n    It might become one in later versions of Werkzeug.\n\n    :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nimport sys\nimport os\nimport errno\nimport time\nimport random\n\nfrom ._compat import to_unicode\nfrom .filesystem import get_filesystem_encoding\n\n\ncan_rename_open_file = False\nif os.name == 'nt':  # pragma: no cover\n    _rename = lambda src, dst: False\n    _rename_atomic = lambda src, dst: False\n\n    try:\n        import ctypes\n\n        _MOVEFILE_REPLACE_EXISTING = 0x1\n        _MOVEFILE_WRITE_THROUGH = 0x8\n        _MoveFileEx = ctypes.windll.kernel32.MoveFileExW\n\n        def _rename(src, dst):\n            src = to_unicode(src, get_filesystem_encoding())\n            dst = to_unicode(dst, get_filesystem_encoding())\n            if _rename_atomic(src, dst):\n                return True\n            retry = 0\n            rv = False\n            while not rv and retry < 100:\n                rv = _MoveFileEx(src, dst, _MOVEFILE_REPLACE_EXISTING |\n                                 _MOVEFILE_WRITE_THROUGH)\n                if not rv:\n                    time.sleep(0.001)\n                    retry += 1\n            return rv\n\n        # new in Vista and Windows Server 2008\n        _CreateTransaction = ctypes.windll.ktmw32.CreateTransaction\n        _CommitTransaction = ctypes.windll.ktmw32.CommitTransaction\n        _MoveFileTransacted = ctypes.windll.kernel32.MoveFileTransactedW\n        _CloseHandle = ctypes.windll.kernel32.CloseHandle\n        can_rename_open_file = True\n\n        def _rename_atomic(src, dst):\n            ta = _CreateTransaction(None, 0, 0, 0, 0, 1000, 'Werkzeug rename')\n            if ta == -1:\n                return False\n            try:\n                retry = 0\n                rv = False\n                while not rv and retry < 100:\n                    rv = _MoveFileTransacted(src, dst, None, None,\n                                             _MOVEFILE_REPLACE_EXISTING |\n                                             _MOVEFILE_WRITE_THROUGH, ta)\n                    if rv:\n                        rv = _CommitTransaction(ta)\n                        break\n                    else:\n                        time.sleep(0.001)\n                        retry += 1\n                return rv\n            finally:\n                _CloseHandle(ta)\n    except Exception:\n        pass\n\n    def rename(src, dst):\n        # Try atomic or pseudo-atomic rename\n        if _rename(src, dst):\n            return\n        # Fall back to \"move away and replace\"\n        try:\n            os.rename(src, dst)\n        except OSError as e:\n            if e.errno != errno.EEXIST:\n                raise\n            old = \"%s-%08x\" % (dst, random.randint(0, sys.maxint))\n            os.rename(dst, old)\n            os.rename(src, dst)\n            try:\n                os.unlink(old)\n            except Exception:\n                pass\nelse:\n    rename = os.rename\n    can_rename_open_file = True\n"
  },
  {
    "path": "lib/werkzeug/routing.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    werkzeug.routing\n    ~~~~~~~~~~~~~~~~\n\n    When it comes to combining multiple controller or view functions (however\n    you want to call them) you need a dispatcher.  A simple way would be\n    applying regular expression tests on the ``PATH_INFO`` and calling\n    registered callback functions that return the value then.\n\n    This module implements a much more powerful system than simple regular\n    expression matching because it can also convert values in the URLs and\n    build URLs.\n\n    Here a simple example that creates an URL map for an application with\n    two subdomains (www and kb) and some URL rules:\n\n    >>> m = Map([\n    ...     # Static URLs\n    ...     Rule('/', endpoint='static/index'),\n    ...     Rule('/about', endpoint='static/about'),\n    ...     Rule('/help', endpoint='static/help'),\n    ...     # Knowledge Base\n    ...     Subdomain('kb', [\n    ...         Rule('/', endpoint='kb/index'),\n    ...         Rule('/browse/', endpoint='kb/browse'),\n    ...         Rule('/browse/<int:id>/', endpoint='kb/browse'),\n    ...         Rule('/browse/<int:id>/<int:page>', endpoint='kb/browse')\n    ...     ])\n    ... ], default_subdomain='www')\n\n    If the application doesn't use subdomains it's perfectly fine to not set\n    the default subdomain and not use the `Subdomain` rule factory.  The endpoint\n    in the rules can be anything, for example import paths or unique\n    identifiers.  The WSGI application can use those endpoints to get the\n    handler for that URL.  It doesn't have to be a string at all but it's\n    recommended.\n\n    Now it's possible to create a URL adapter for one of the subdomains and\n    build URLs:\n\n    >>> c = m.bind('example.com')\n    >>> c.build(\"kb/browse\", dict(id=42))\n    'http://kb.example.com/browse/42/'\n    >>> c.build(\"kb/browse\", dict())\n    'http://kb.example.com/browse/'\n    >>> c.build(\"kb/browse\", dict(id=42, page=3))\n    'http://kb.example.com/browse/42/3'\n    >>> c.build(\"static/about\")\n    '/about'\n    >>> c.build(\"static/index\", force_external=True)\n    'http://www.example.com/'\n\n    >>> c = m.bind('example.com', subdomain='kb')\n    >>> c.build(\"static/about\")\n    'http://www.example.com/about'\n\n    The first argument to bind is the server name *without* the subdomain.\n    Per default it will assume that the script is mounted on the root, but\n    often that's not the case so you can provide the real mount point as\n    second argument:\n\n    >>> c = m.bind('example.com', '/applications/example')\n\n    The third argument can be the subdomain, if not given the default\n    subdomain is used.  For more details about binding have a look at the\n    documentation of the `MapAdapter`.\n\n    And here is how you can match URLs:\n\n    >>> c = m.bind('example.com')\n    >>> c.match(\"/\")\n    ('static/index', {})\n    >>> c.match(\"/about\")\n    ('static/about', {})\n    >>> c = m.bind('example.com', '/', 'kb')\n    >>> c.match(\"/\")\n    ('kb/index', {})\n    >>> c.match(\"/browse/42/23\")\n    ('kb/browse', {'id': 42, 'page': 23})\n\n    If matching fails you get a `NotFound` exception, if the rule thinks\n    it's a good idea to redirect (for example because the URL was defined\n    to have a slash at the end but the request was missing that slash) it\n    will raise a `RequestRedirect` exception.  Both are subclasses of the\n    `HTTPException` so you can use those errors as responses in the\n    application.\n\n    If matching succeeded but the URL rule was incompatible to the given\n    method (for example there were only rules for `GET` and `HEAD` and\n    routing system tried to match a `POST` request) a `MethodNotAllowed`\n    method is raised.\n\n\n    :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nimport difflib\nimport re\nimport uuid\nimport posixpath\n\nfrom pprint import pformat\nfrom threading import Lock\n\nfrom werkzeug.urls import url_encode, url_quote, url_join\nfrom werkzeug.utils import redirect, format_string\nfrom werkzeug.exceptions import HTTPException, NotFound, MethodNotAllowed\nfrom werkzeug._internal import _get_environ, _encode_idna\nfrom werkzeug._compat import itervalues, iteritems, to_unicode, to_bytes, \\\n    text_type, string_types, native_string_result, \\\n    implements_to_string, wsgi_decoding_dance\nfrom werkzeug.datastructures import ImmutableDict, MultiDict\n\n\n_rule_re = re.compile(r'''\n    (?P<static>[^<]*)                           # static rule data\n    <\n    (?:\n        (?P<converter>[a-zA-Z_][a-zA-Z0-9_]*)   # converter name\n        (?:\\((?P<args>.*?)\\))?                  # converter arguments\n        \\:                                      # variable delimiter\n    )?\n    (?P<variable>[a-zA-Z_][a-zA-Z0-9_]*)        # variable name\n    >\n''', re.VERBOSE)\n_simple_rule_re = re.compile(r'<([^>]+)>')\n_converter_args_re = re.compile(r'''\n    ((?P<name>\\w+)\\s*=\\s*)?\n    (?P<value>\n        True|False|\n        \\d+.\\d+|\n        \\d+.|\n        \\d+|\n        \\w+|\n        [urUR]?(?P<stringval>\"[^\"]*?\"|'[^']*')\n    )\\s*,\n''', re.VERBOSE | re.UNICODE)\n\n\n_PYTHON_CONSTANTS = {\n    'None':     None,\n    'True':     True,\n    'False':    False\n}\n\n\ndef _pythonize(value):\n    if value in _PYTHON_CONSTANTS:\n        return _PYTHON_CONSTANTS[value]\n    for convert in int, float:\n        try:\n            return convert(value)\n        except ValueError:\n            pass\n    if value[:1] == value[-1:] and value[0] in '\"\\'':\n        value = value[1:-1]\n    return text_type(value)\n\n\ndef parse_converter_args(argstr):\n    argstr += ','\n    args = []\n    kwargs = {}\n\n    for item in _converter_args_re.finditer(argstr):\n        value = item.group('stringval')\n        if value is None:\n            value = item.group('value')\n        value = _pythonize(value)\n        if not item.group('name'):\n            args.append(value)\n        else:\n            name = item.group('name')\n            kwargs[name] = value\n\n    return tuple(args), kwargs\n\n\ndef parse_rule(rule):\n    \"\"\"Parse a rule and return it as generator. Each iteration yields tuples\n    in the form ``(converter, arguments, variable)``. If the converter is\n    `None` it's a static url part, otherwise it's a dynamic one.\n\n    :internal:\n    \"\"\"\n    pos = 0\n    end = len(rule)\n    do_match = _rule_re.match\n    used_names = set()\n    while pos < end:\n        m = do_match(rule, pos)\n        if m is None:\n            break\n        data = m.groupdict()\n        if data['static']:\n            yield None, None, data['static']\n        variable = data['variable']\n        converter = data['converter'] or 'default'\n        if variable in used_names:\n            raise ValueError('variable name %r used twice.' % variable)\n        used_names.add(variable)\n        yield converter, data['args'] or None, variable\n        pos = m.end()\n    if pos < end:\n        remaining = rule[pos:]\n        if '>' in remaining or '<' in remaining:\n            raise ValueError('malformed url rule: %r' % rule)\n        yield None, None, remaining\n\n\nclass RoutingException(Exception):\n\n    \"\"\"Special exceptions that require the application to redirect, notifying\n    about missing urls, etc.\n\n    :internal:\n    \"\"\"\n\n\nclass RequestRedirect(HTTPException, RoutingException):\n\n    \"\"\"Raise if the map requests a redirect. This is for example the case if\n    `strict_slashes` are activated and an url that requires a trailing slash.\n\n    The attribute `new_url` contains the absolute destination url.\n    \"\"\"\n    code = 301\n\n    def __init__(self, new_url):\n        RoutingException.__init__(self, new_url)\n        self.new_url = new_url\n\n    def get_response(self, environ):\n        return redirect(self.new_url, self.code)\n\n\nclass RequestSlash(RoutingException):\n\n    \"\"\"Internal exception.\"\"\"\n\n\nclass RequestAliasRedirect(RoutingException):\n\n    \"\"\"This rule is an alias and wants to redirect to the canonical URL.\"\"\"\n\n    def __init__(self, matched_values):\n        self.matched_values = matched_values\n\n\nclass BuildError(RoutingException, LookupError):\n\n    \"\"\"Raised if the build system cannot find a URL for an endpoint with the\n    values provided.\n    \"\"\"\n\n    def __init__(self, endpoint, values, method, adapter=None):\n        LookupError.__init__(self, endpoint, values, method)\n        self.endpoint = endpoint\n        self.values = values\n        self.method = method\n        self.suggested = self.closest_rule(adapter)\n\n    def closest_rule(self, adapter):\n        def score_rule(rule):\n            return sum([\n                0.98 * difflib.SequenceMatcher(\n                    None, rule.endpoint, self.endpoint\n                ).ratio(),\n                0.01 * bool(set(self.values or ()).issubset(rule.arguments)),\n                0.01 * bool(rule.methods and self.method in rule.methods)\n            ])\n\n        if adapter and adapter.map._rules:\n            return max(adapter.map._rules, key=score_rule)\n        else:\n            return None\n\n    def __str__(self):\n        message = []\n        message.append(\"Could not build url for endpoint %r\" % self.endpoint)\n        if self.method:\n            message.append(\" (%r)\" % self.method)\n        if self.values:\n            message.append(\" with values %r\" % sorted(self.values.keys()))\n        message.append(\".\")\n        if self.suggested:\n            if self.endpoint == self.suggested.endpoint:\n                if self.method and self.method not in self.suggested.methods:\n                    message.append(\" Did you mean to use methods %r?\" % sorted(\n                        self.suggested.methods\n                    ))\n                missing_values = self.suggested.arguments.union(\n                    set(self.suggested.defaults or ())\n                ) - set(self.values.keys())\n                if missing_values:\n                    message.append(\n                        \" Did you forget to specify values %r?\" %\n                        sorted(missing_values)\n                    )\n            else:\n                message.append(\n                    \" Did you mean %r instead?\" % self.suggested.endpoint\n                )\n        return \"\".join(message)\n\n\nclass ValidationError(ValueError):\n\n    \"\"\"Validation error.  If a rule converter raises this exception the rule\n    does not match the current URL and the next URL is tried.\n    \"\"\"\n\n\nclass RuleFactory(object):\n\n    \"\"\"As soon as you have more complex URL setups it's a good idea to use rule\n    factories to avoid repetitive tasks.  Some of them are builtin, others can\n    be added by subclassing `RuleFactory` and overriding `get_rules`.\n    \"\"\"\n\n    def get_rules(self, map):\n        \"\"\"Subclasses of `RuleFactory` have to override this method and return\n        an iterable of rules.\"\"\"\n        raise NotImplementedError()\n\n\nclass Subdomain(RuleFactory):\n\n    \"\"\"All URLs provided by this factory have the subdomain set to a\n    specific domain. For example if you want to use the subdomain for\n    the current language this can be a good setup::\n\n        url_map = Map([\n            Rule('/', endpoint='#select_language'),\n            Subdomain('<string(length=2):lang_code>', [\n                Rule('/', endpoint='index'),\n                Rule('/about', endpoint='about'),\n                Rule('/help', endpoint='help')\n            ])\n        ])\n\n    All the rules except for the ``'#select_language'`` endpoint will now\n    listen on a two letter long subdomain that holds the language code\n    for the current request.\n    \"\"\"\n\n    def __init__(self, subdomain, rules):\n        self.subdomain = subdomain\n        self.rules = rules\n\n    def get_rules(self, map):\n        for rulefactory in self.rules:\n            for rule in rulefactory.get_rules(map):\n                rule = rule.empty()\n                rule.subdomain = self.subdomain\n                yield rule\n\n\nclass Submount(RuleFactory):\n\n    \"\"\"Like `Subdomain` but prefixes the URL rule with a given string::\n\n        url_map = Map([\n            Rule('/', endpoint='index'),\n            Submount('/blog', [\n                Rule('/', endpoint='blog/index'),\n                Rule('/entry/<entry_slug>', endpoint='blog/show')\n            ])\n        ])\n\n    Now the rule ``'blog/show'`` matches ``/blog/entry/<entry_slug>``.\n    \"\"\"\n\n    def __init__(self, path, rules):\n        self.path = path.rstrip('/')\n        self.rules = rules\n\n    def get_rules(self, map):\n        for rulefactory in self.rules:\n            for rule in rulefactory.get_rules(map):\n                rule = rule.empty()\n                rule.rule = self.path + rule.rule\n                yield rule\n\n\nclass EndpointPrefix(RuleFactory):\n\n    \"\"\"Prefixes all endpoints (which must be strings for this factory) with\n    another string. This can be useful for sub applications::\n\n        url_map = Map([\n            Rule('/', endpoint='index'),\n            EndpointPrefix('blog/', [Submount('/blog', [\n                Rule('/', endpoint='index'),\n                Rule('/entry/<entry_slug>', endpoint='show')\n            ])])\n        ])\n    \"\"\"\n\n    def __init__(self, prefix, rules):\n        self.prefix = prefix\n        self.rules = rules\n\n    def get_rules(self, map):\n        for rulefactory in self.rules:\n            for rule in rulefactory.get_rules(map):\n                rule = rule.empty()\n                rule.endpoint = self.prefix + rule.endpoint\n                yield rule\n\n\nclass RuleTemplate(object):\n\n    \"\"\"Returns copies of the rules wrapped and expands string templates in\n    the endpoint, rule, defaults or subdomain sections.\n\n    Here a small example for such a rule template::\n\n        from werkzeug.routing import Map, Rule, RuleTemplate\n\n        resource = RuleTemplate([\n            Rule('/$name/', endpoint='$name.list'),\n            Rule('/$name/<int:id>', endpoint='$name.show')\n        ])\n\n        url_map = Map([resource(name='user'), resource(name='page')])\n\n    When a rule template is called the keyword arguments are used to\n    replace the placeholders in all the string parameters.\n    \"\"\"\n\n    def __init__(self, rules):\n        self.rules = list(rules)\n\n    def __call__(self, *args, **kwargs):\n        return RuleTemplateFactory(self.rules, dict(*args, **kwargs))\n\n\nclass RuleTemplateFactory(RuleFactory):\n\n    \"\"\"A factory that fills in template variables into rules.  Used by\n    `RuleTemplate` internally.\n\n    :internal:\n    \"\"\"\n\n    def __init__(self, rules, context):\n        self.rules = rules\n        self.context = context\n\n    def get_rules(self, map):\n        for rulefactory in self.rules:\n            for rule in rulefactory.get_rules(map):\n                new_defaults = subdomain = None\n                if rule.defaults:\n                    new_defaults = {}\n                    for key, value in iteritems(rule.defaults):\n                        if isinstance(value, string_types):\n                            value = format_string(value, self.context)\n                        new_defaults[key] = value\n                if rule.subdomain is not None:\n                    subdomain = format_string(rule.subdomain, self.context)\n                new_endpoint = rule.endpoint\n                if isinstance(new_endpoint, string_types):\n                    new_endpoint = format_string(new_endpoint, self.context)\n                yield Rule(\n                    format_string(rule.rule, self.context),\n                    new_defaults,\n                    subdomain,\n                    rule.methods,\n                    rule.build_only,\n                    new_endpoint,\n                    rule.strict_slashes\n                )\n\n\n@implements_to_string\nclass Rule(RuleFactory):\n\n    \"\"\"A Rule represents one URL pattern.  There are some options for `Rule`\n    that change the way it behaves and are passed to the `Rule` constructor.\n    Note that besides the rule-string all arguments *must* be keyword arguments\n    in order to not break the application on Werkzeug upgrades.\n\n    `string`\n        Rule strings basically are just normal URL paths with placeholders in\n        the format ``<converter(arguments):name>`` where the converter and the\n        arguments are optional.  If no converter is defined the `default`\n        converter is used which means `string` in the normal configuration.\n\n        URL rules that end with a slash are branch URLs, others are leaves.\n        If you have `strict_slashes` enabled (which is the default), all\n        branch URLs that are matched without a trailing slash will trigger a\n        redirect to the same URL with the missing slash appended.\n\n        The converters are defined on the `Map`.\n\n    `endpoint`\n        The endpoint for this rule. This can be anything. A reference to a\n        function, a string, a number etc.  The preferred way is using a string\n        because the endpoint is used for URL generation.\n\n    `defaults`\n        An optional dict with defaults for other rules with the same endpoint.\n        This is a bit tricky but useful if you want to have unique URLs::\n\n            url_map = Map([\n                Rule('/all/', defaults={'page': 1}, endpoint='all_entries'),\n                Rule('/all/page/<int:page>', endpoint='all_entries')\n            ])\n\n        If a user now visits ``http://example.com/all/page/1`` he will be\n        redirected to ``http://example.com/all/``.  If `redirect_defaults` is\n        disabled on the `Map` instance this will only affect the URL\n        generation.\n\n    `subdomain`\n        The subdomain rule string for this rule. If not specified the rule\n        only matches for the `default_subdomain` of the map.  If the map is\n        not bound to a subdomain this feature is disabled.\n\n        Can be useful if you want to have user profiles on different subdomains\n        and all subdomains are forwarded to your application::\n\n            url_map = Map([\n                Rule('/', subdomain='<username>', endpoint='user/homepage'),\n                Rule('/stats', subdomain='<username>', endpoint='user/stats')\n            ])\n\n    `methods`\n        A sequence of http methods this rule applies to.  If not specified, all\n        methods are allowed. For example this can be useful if you want different\n        endpoints for `POST` and `GET`.  If methods are defined and the path\n        matches but the method matched against is not in this list or in the\n        list of another rule for that path the error raised is of the type\n        `MethodNotAllowed` rather than `NotFound`.  If `GET` is present in the\n        list of methods and `HEAD` is not, `HEAD` is added automatically.\n\n        .. versionchanged:: 0.6.1\n           `HEAD` is now automatically added to the methods if `GET` is\n           present.  The reason for this is that existing code often did not\n           work properly in servers not rewriting `HEAD` to `GET`\n           automatically and it was not documented how `HEAD` should be\n           treated.  This was considered a bug in Werkzeug because of that.\n\n    `strict_slashes`\n        Override the `Map` setting for `strict_slashes` only for this rule. If\n        not specified the `Map` setting is used.\n\n    `build_only`\n        Set this to True and the rule will never match but will create a URL\n        that can be build. This is useful if you have resources on a subdomain\n        or folder that are not handled by the WSGI application (like static data)\n\n    `redirect_to`\n        If given this must be either a string or callable.  In case of a\n        callable it's called with the url adapter that triggered the match and\n        the values of the URL as keyword arguments and has to return the target\n        for the redirect, otherwise it has to be a string with placeholders in\n        rule syntax::\n\n            def foo_with_slug(adapter, id):\n                # ask the database for the slug for the old id.  this of\n                # course has nothing to do with werkzeug.\n                return 'foo/' + Foo.get_slug_for_id(id)\n\n            url_map = Map([\n                Rule('/foo/<slug>', endpoint='foo'),\n                Rule('/some/old/url/<slug>', redirect_to='foo/<slug>'),\n                Rule('/other/old/url/<int:id>', redirect_to=foo_with_slug)\n            ])\n\n        When the rule is matched the routing system will raise a\n        `RequestRedirect` exception with the target for the redirect.\n\n        Keep in mind that the URL will be joined against the URL root of the\n        script so don't use a leading slash on the target URL unless you\n        really mean root of that domain.\n\n    `alias`\n        If enabled this rule serves as an alias for another rule with the same\n        endpoint and arguments.\n\n    `host`\n        If provided and the URL map has host matching enabled this can be\n        used to provide a match rule for the whole host.  This also means\n        that the subdomain feature is disabled.\n\n    .. versionadded:: 0.7\n       The `alias` and `host` parameters were added.\n    \"\"\"\n\n    def __init__(self, string, defaults=None, subdomain=None, methods=None,\n                 build_only=False, endpoint=None, strict_slashes=None,\n                 redirect_to=None, alias=False, host=None):\n        if not string.startswith('/'):\n            raise ValueError('urls must start with a leading slash')\n        self.rule = string\n        self.is_leaf = not string.endswith('/')\n\n        self.map = None\n        self.strict_slashes = strict_slashes\n        self.subdomain = subdomain\n        self.host = host\n        self.defaults = defaults\n        self.build_only = build_only\n        self.alias = alias\n        if methods is None:\n            self.methods = None\n        else:\n            self.methods = set([x.upper() for x in methods])\n            if 'HEAD' not in self.methods and 'GET' in self.methods:\n                self.methods.add('HEAD')\n        self.endpoint = endpoint\n        self.redirect_to = redirect_to\n\n        if defaults:\n            self.arguments = set(map(str, defaults))\n        else:\n            self.arguments = set()\n        self._trace = self._converters = self._regex = self._weights = None\n\n    def empty(self):\n        \"\"\"\n        Return an unbound copy of this rule.\n\n        This can be useful if want to reuse an already bound URL for another\n        map.  See ``get_empty_kwargs`` to override what keyword arguments are\n        provided to the new copy.\n        \"\"\"\n        return type(self)(self.rule, **self.get_empty_kwargs())\n\n    def get_empty_kwargs(self):\n        \"\"\"\n        Provides kwargs for instantiating empty copy with empty()\n\n        Use this method to provide custom keyword arguments to the subclass of\n        ``Rule`` when calling ``some_rule.empty()``.  Helpful when the subclass\n        has custom keyword arguments that are needed at instantiation.\n\n        Must return a ``dict`` that will be provided as kwargs to the new\n        instance of ``Rule``, following the initial ``self.rule`` value which\n        is always provided as the first, required positional argument.\n        \"\"\"\n        defaults = None\n        if self.defaults:\n            defaults = dict(self.defaults)\n        return dict(defaults=defaults, subdomain=self.subdomain,\n                    methods=self.methods, build_only=self.build_only,\n                    endpoint=self.endpoint, strict_slashes=self.strict_slashes,\n                    redirect_to=self.redirect_to, alias=self.alias,\n                    host=self.host)\n\n    def get_rules(self, map):\n        yield self\n\n    def refresh(self):\n        \"\"\"Rebinds and refreshes the URL.  Call this if you modified the\n        rule in place.\n\n        :internal:\n        \"\"\"\n        self.bind(self.map, rebind=True)\n\n    def bind(self, map, rebind=False):\n        \"\"\"Bind the url to a map and create a regular expression based on\n        the information from the rule itself and the defaults from the map.\n\n        :internal:\n        \"\"\"\n        if self.map is not None and not rebind:\n            raise RuntimeError('url rule %r already bound to map %r' %\n                               (self, self.map))\n        self.map = map\n        if self.strict_slashes is None:\n            self.strict_slashes = map.strict_slashes\n        if self.subdomain is None:\n            self.subdomain = map.default_subdomain\n        self.compile()\n\n    def get_converter(self, variable_name, converter_name, args, kwargs):\n        \"\"\"Looks up the converter for the given parameter.\n\n        .. versionadded:: 0.9\n        \"\"\"\n        if converter_name not in self.map.converters:\n            raise LookupError('the converter %r does not exist' % converter_name)\n        return self.map.converters[converter_name](self.map, *args, **kwargs)\n\n    def compile(self):\n        \"\"\"Compiles the regular expression and stores it.\"\"\"\n        assert self.map is not None, 'rule not bound'\n\n        if self.map.host_matching:\n            domain_rule = self.host or ''\n        else:\n            domain_rule = self.subdomain or ''\n\n        self._trace = []\n        self._converters = {}\n        self._weights = []\n        regex_parts = []\n\n        def _build_regex(rule):\n            for converter, arguments, variable in parse_rule(rule):\n                if converter is None:\n                    regex_parts.append(re.escape(variable))\n                    self._trace.append((False, variable))\n                    for part in variable.split('/'):\n                        if part:\n                            self._weights.append((0, -len(part)))\n                else:\n                    if arguments:\n                        c_args, c_kwargs = parse_converter_args(arguments)\n                    else:\n                        c_args = ()\n                        c_kwargs = {}\n                    convobj = self.get_converter(\n                        variable, converter, c_args, c_kwargs)\n                    regex_parts.append('(?P<%s>%s)' % (variable, convobj.regex))\n                    self._converters[variable] = convobj\n                    self._trace.append((True, variable))\n                    self._weights.append((1, convobj.weight))\n                    self.arguments.add(str(variable))\n\n        _build_regex(domain_rule)\n        regex_parts.append('\\\\|')\n        self._trace.append((False, '|'))\n        _build_regex(self.is_leaf and self.rule or self.rule.rstrip('/'))\n        if not self.is_leaf:\n            self._trace.append((False, '/'))\n\n        if self.build_only:\n            return\n        regex = r'^%s%s$' % (\n            u''.join(regex_parts),\n            (not self.is_leaf or not self.strict_slashes) and\n            '(?<!/)(?P<__suffix__>/?)' or ''\n        )\n        self._regex = re.compile(regex, re.UNICODE)\n\n    def match(self, path):\n        \"\"\"Check if the rule matches a given path. Path is a string in the\n        form ``\"subdomain|/path(method)\"`` and is assembled by the map.  If\n        the map is doing host matching the subdomain part will be the host\n        instead.\n\n        If the rule matches a dict with the converted values is returned,\n        otherwise the return value is `None`.\n\n        :internal:\n        \"\"\"\n        if not self.build_only:\n            m = self._regex.search(path)\n            if m is not None:\n                groups = m.groupdict()\n                # we have a folder like part of the url without a trailing\n                # slash and strict slashes enabled. raise an exception that\n                # tells the map to redirect to the same url but with a\n                # trailing slash\n                if self.strict_slashes and not self.is_leaf and \\\n                   not groups.pop('__suffix__'):\n                    raise RequestSlash()\n                # if we are not in strict slashes mode we have to remove\n                # a __suffix__\n                elif not self.strict_slashes:\n                    del groups['__suffix__']\n\n                result = {}\n                for name, value in iteritems(groups):\n                    try:\n                        value = self._converters[name].to_python(value)\n                    except ValidationError:\n                        return\n                    result[str(name)] = value\n                if self.defaults:\n                    result.update(self.defaults)\n\n                if self.alias and self.map.redirect_defaults:\n                    raise RequestAliasRedirect(result)\n\n                return result\n\n    def build(self, values, append_unknown=True):\n        \"\"\"Assembles the relative url for that rule and the subdomain.\n        If building doesn't work for some reasons `None` is returned.\n\n        :internal:\n        \"\"\"\n        tmp = []\n        add = tmp.append\n        processed = set(self.arguments)\n        for is_dynamic, data in self._trace:\n            if is_dynamic:\n                try:\n                    add(self._converters[data].to_url(values[data]))\n                except ValidationError:\n                    return\n                processed.add(data)\n            else:\n                add(url_quote(to_bytes(data, self.map.charset), safe='/:|+'))\n        domain_part, url = (u''.join(tmp)).split(u'|', 1)\n\n        if append_unknown:\n            query_vars = MultiDict(values)\n            for key in processed:\n                if key in query_vars:\n                    del query_vars[key]\n\n            if query_vars:\n                url += u'?' + url_encode(query_vars, charset=self.map.charset,\n                                         sort=self.map.sort_parameters,\n                                         key=self.map.sort_key)\n\n        return domain_part, url\n\n    def provides_defaults_for(self, rule):\n        \"\"\"Check if this rule has defaults for a given rule.\n\n        :internal:\n        \"\"\"\n        return not self.build_only and self.defaults and \\\n            self.endpoint == rule.endpoint and self != rule and \\\n            self.arguments == rule.arguments\n\n    def suitable_for(self, values, method=None):\n        \"\"\"Check if the dict of values has enough data for url generation.\n\n        :internal:\n        \"\"\"\n        # if a method was given explicitly and that method is not supported\n        # by this rule, this rule is not suitable.\n        if method is not None and self.methods is not None \\\n           and method not in self.methods:\n            return False\n\n        defaults = self.defaults or ()\n\n        # all arguments required must be either in the defaults dict or\n        # the value dictionary otherwise it's not suitable\n        for key in self.arguments:\n            if key not in defaults and key not in values:\n                return False\n\n        # in case defaults are given we ensure taht either the value was\n        # skipped or the value is the same as the default value.\n        if defaults:\n            for key, value in iteritems(defaults):\n                if key in values and value != values[key]:\n                    return False\n\n        return True\n\n    def match_compare_key(self):\n        \"\"\"The match compare key for sorting.\n\n        Current implementation:\n\n        1.  rules without any arguments come first for performance\n            reasons only as we expect them to match faster and some\n            common ones usually don't have any arguments (index pages etc.)\n        2.  The more complex rules come first so the second argument is the\n            negative length of the number of weights.\n        3.  lastly we order by the actual weights.\n\n        :internal:\n        \"\"\"\n        return bool(self.arguments), -len(self._weights), self._weights\n\n    def build_compare_key(self):\n        \"\"\"The build compare key for sorting.\n\n        :internal:\n        \"\"\"\n        return self.alias and 1 or 0, -len(self.arguments), \\\n            -len(self.defaults or ())\n\n    def __eq__(self, other):\n        return self.__class__ is other.__class__ and \\\n            self._trace == other._trace\n\n    def __ne__(self, other):\n        return not self.__eq__(other)\n\n    def __str__(self):\n        return self.rule\n\n    @native_string_result\n    def __repr__(self):\n        if self.map is None:\n            return u'<%s (unbound)>' % self.__class__.__name__\n        tmp = []\n        for is_dynamic, data in self._trace:\n            if is_dynamic:\n                tmp.append(u'<%s>' % data)\n            else:\n                tmp.append(data)\n        return u'<%s %s%s -> %s>' % (\n            self.__class__.__name__,\n            repr((u''.join(tmp)).lstrip(u'|')).lstrip(u'u'),\n            self.methods is not None\n            and u' (%s)' % u', '.join(self.methods)\n            or u'',\n            self.endpoint\n        )\n\n\nclass BaseConverter(object):\n\n    \"\"\"Base class for all converters.\"\"\"\n    regex = '[^/]+'\n    weight = 100\n\n    def __init__(self, map):\n        self.map = map\n\n    def to_python(self, value):\n        return value\n\n    def to_url(self, value):\n        return url_quote(value, charset=self.map.charset)\n\n\nclass UnicodeConverter(BaseConverter):\n\n    \"\"\"This converter is the default converter and accepts any string but\n    only one path segment.  Thus the string can not include a slash.\n\n    This is the default validator.\n\n    Example::\n\n        Rule('/pages/<page>'),\n        Rule('/<string(length=2):lang_code>')\n\n    :param map: the :class:`Map`.\n    :param minlength: the minimum length of the string.  Must be greater\n                      or equal 1.\n    :param maxlength: the maximum length of the string.\n    :param length: the exact length of the string.\n    \"\"\"\n\n    def __init__(self, map, minlength=1, maxlength=None, length=None):\n        BaseConverter.__init__(self, map)\n        if length is not None:\n            length = '{%d}' % int(length)\n        else:\n            if maxlength is None:\n                maxlength = ''\n            else:\n                maxlength = int(maxlength)\n            length = '{%s,%s}' % (\n                int(minlength),\n                maxlength\n            )\n        self.regex = '[^/]' + length\n\n\nclass AnyConverter(BaseConverter):\n\n    \"\"\"Matches one of the items provided.  Items can either be Python\n    identifiers or strings::\n\n        Rule('/<any(about, help, imprint, class, \"foo,bar\"):page_name>')\n\n    :param map: the :class:`Map`.\n    :param items: this function accepts the possible items as positional\n                  arguments.\n    \"\"\"\n\n    def __init__(self, map, *items):\n        BaseConverter.__init__(self, map)\n        self.regex = '(?:%s)' % '|'.join([re.escape(x) for x in items])\n\n\nclass PathConverter(BaseConverter):\n\n    \"\"\"Like the default :class:`UnicodeConverter`, but it also matches\n    slashes.  This is useful for wikis and similar applications::\n\n        Rule('/<path:wikipage>')\n        Rule('/<path:wikipage>/edit')\n\n    :param map: the :class:`Map`.\n    \"\"\"\n    regex = '[^/].*?'\n    weight = 200\n\n\nclass NumberConverter(BaseConverter):\n\n    \"\"\"Baseclass for `IntegerConverter` and `FloatConverter`.\n\n    :internal:\n    \"\"\"\n    weight = 50\n\n    def __init__(self, map, fixed_digits=0, min=None, max=None):\n        BaseConverter.__init__(self, map)\n        self.fixed_digits = fixed_digits\n        self.min = min\n        self.max = max\n\n    def to_python(self, value):\n        if (self.fixed_digits and len(value) != self.fixed_digits):\n            raise ValidationError()\n        value = self.num_convert(value)\n        if (self.min is not None and value < self.min) or \\\n           (self.max is not None and value > self.max):\n            raise ValidationError()\n        return value\n\n    def to_url(self, value):\n        value = self.num_convert(value)\n        if self.fixed_digits:\n            value = ('%%0%sd' % self.fixed_digits) % value\n        return str(value)\n\n\nclass IntegerConverter(NumberConverter):\n\n    \"\"\"This converter only accepts integer values::\n\n        Rule('/page/<int:page>')\n\n    This converter does not support negative values.\n\n    :param map: the :class:`Map`.\n    :param fixed_digits: the number of fixed digits in the URL.  If you set\n                         this to ``4`` for example, the application will\n                         only match if the url looks like ``/0001/``.  The\n                         default is variable length.\n    :param min: the minimal value.\n    :param max: the maximal value.\n    \"\"\"\n    regex = r'\\d+'\n    num_convert = int\n\n\nclass FloatConverter(NumberConverter):\n\n    \"\"\"This converter only accepts floating point values::\n\n        Rule('/probability/<float:probability>')\n\n    This converter does not support negative values.\n\n    :param map: the :class:`Map`.\n    :param min: the minimal value.\n    :param max: the maximal value.\n    \"\"\"\n    regex = r'\\d+\\.\\d+'\n    num_convert = float\n\n    def __init__(self, map, min=None, max=None):\n        NumberConverter.__init__(self, map, 0, min, max)\n\n\nclass UUIDConverter(BaseConverter):\n\n    \"\"\"This converter only accepts UUID strings::\n\n        Rule('/object/<uuid:identifier>')\n\n    .. versionadded:: 0.10\n\n    :param map: the :class:`Map`.\n    \"\"\"\n    regex = r'[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-' \\\n            r'[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}'\n\n    def to_python(self, value):\n        return uuid.UUID(value)\n\n    def to_url(self, value):\n        return str(value)\n\n\n#: the default converter mapping for the map.\nDEFAULT_CONVERTERS = {\n    'default':          UnicodeConverter,\n    'string':           UnicodeConverter,\n    'any':              AnyConverter,\n    'path':             PathConverter,\n    'int':              IntegerConverter,\n    'float':            FloatConverter,\n    'uuid':             UUIDConverter,\n}\n\n\nclass Map(object):\n\n    \"\"\"The map class stores all the URL rules and some configuration\n    parameters.  Some of the configuration values are only stored on the\n    `Map` instance since those affect all rules, others are just defaults\n    and can be overridden for each rule.  Note that you have to specify all\n    arguments besides the `rules` as keyword arguments!\n\n    :param rules: sequence of url rules for this map.\n    :param default_subdomain: The default subdomain for rules without a\n                              subdomain defined.\n    :param charset: charset of the url. defaults to ``\"utf-8\"``\n    :param strict_slashes: Take care of trailing slashes.\n    :param redirect_defaults: This will redirect to the default rule if it\n                              wasn't visited that way. This helps creating\n                              unique URLs.\n    :param converters: A dict of converters that adds additional converters\n                       to the list of converters. If you redefine one\n                       converter this will override the original one.\n    :param sort_parameters: If set to `True` the url parameters are sorted.\n                            See `url_encode` for more details.\n    :param sort_key: The sort key function for `url_encode`.\n    :param encoding_errors: the error method to use for decoding\n    :param host_matching: if set to `True` it enables the host matching\n                          feature and disables the subdomain one.  If\n                          enabled the `host` parameter to rules is used\n                          instead of the `subdomain` one.\n\n    .. versionadded:: 0.5\n        `sort_parameters` and `sort_key` was added.\n\n    .. versionadded:: 0.7\n        `encoding_errors` and `host_matching` was added.\n    \"\"\"\n\n    #: .. versionadded:: 0.6\n    #:    a dict of default converters to be used.\n    default_converters = ImmutableDict(DEFAULT_CONVERTERS)\n\n    def __init__(self, rules=None, default_subdomain='', charset='utf-8',\n                 strict_slashes=True, redirect_defaults=True,\n                 converters=None, sort_parameters=False, sort_key=None,\n                 encoding_errors='replace', host_matching=False):\n        self._rules = []\n        self._rules_by_endpoint = {}\n        self._remap = True\n        self._remap_lock = Lock()\n\n        self.default_subdomain = default_subdomain\n        self.charset = charset\n        self.encoding_errors = encoding_errors\n        self.strict_slashes = strict_slashes\n        self.redirect_defaults = redirect_defaults\n        self.host_matching = host_matching\n\n        self.converters = self.default_converters.copy()\n        if converters:\n            self.converters.update(converters)\n\n        self.sort_parameters = sort_parameters\n        self.sort_key = sort_key\n\n        for rulefactory in rules or ():\n            self.add(rulefactory)\n\n    def is_endpoint_expecting(self, endpoint, *arguments):\n        \"\"\"Iterate over all rules and check if the endpoint expects\n        the arguments provided.  This is for example useful if you have\n        some URLs that expect a language code and others that do not and\n        you want to wrap the builder a bit so that the current language\n        code is automatically added if not provided but endpoints expect\n        it.\n\n        :param endpoint: the endpoint to check.\n        :param arguments: this function accepts one or more arguments\n                          as positional arguments.  Each one of them is\n                          checked.\n        \"\"\"\n        self.update()\n        arguments = set(arguments)\n        for rule in self._rules_by_endpoint[endpoint]:\n            if arguments.issubset(rule.arguments):\n                return True\n        return False\n\n    def iter_rules(self, endpoint=None):\n        \"\"\"Iterate over all rules or the rules of an endpoint.\n\n        :param endpoint: if provided only the rules for that endpoint\n                         are returned.\n        :return: an iterator\n        \"\"\"\n        self.update()\n        if endpoint is not None:\n            return iter(self._rules_by_endpoint[endpoint])\n        return iter(self._rules)\n\n    def add(self, rulefactory):\n        \"\"\"Add a new rule or factory to the map and bind it.  Requires that the\n        rule is not bound to another map.\n\n        :param rulefactory: a :class:`Rule` or :class:`RuleFactory`\n        \"\"\"\n        for rule in rulefactory.get_rules(self):\n            rule.bind(self)\n            self._rules.append(rule)\n            self._rules_by_endpoint.setdefault(rule.endpoint, []).append(rule)\n        self._remap = True\n\n    def bind(self, server_name, script_name=None, subdomain=None,\n             url_scheme='http', default_method='GET', path_info=None,\n             query_args=None):\n        \"\"\"Return a new :class:`MapAdapter` with the details specified to the\n        call.  Note that `script_name` will default to ``'/'`` if not further\n        specified or `None`.  The `server_name` at least is a requirement\n        because the HTTP RFC requires absolute URLs for redirects and so all\n        redirect exceptions raised by Werkzeug will contain the full canonical\n        URL.\n\n        If no path_info is passed to :meth:`match` it will use the default path\n        info passed to bind.  While this doesn't really make sense for\n        manual bind calls, it's useful if you bind a map to a WSGI\n        environment which already contains the path info.\n\n        `subdomain` will default to the `default_subdomain` for this map if\n        no defined. If there is no `default_subdomain` you cannot use the\n        subdomain feature.\n\n        .. versionadded:: 0.7\n           `query_args` added\n\n        .. versionadded:: 0.8\n           `query_args` can now also be a string.\n        \"\"\"\n        server_name = server_name.lower()\n        if self.host_matching:\n            if subdomain is not None:\n                raise RuntimeError('host matching enabled and a '\n                                   'subdomain was provided')\n        elif subdomain is None:\n            subdomain = self.default_subdomain\n        if script_name is None:\n            script_name = '/'\n        server_name = _encode_idna(server_name)\n        return MapAdapter(self, server_name, script_name, subdomain,\n                          url_scheme, path_info, default_method, query_args)\n\n    def bind_to_environ(self, environ, server_name=None, subdomain=None):\n        \"\"\"Like :meth:`bind` but you can pass it an WSGI environment and it\n        will fetch the information from that dictionary.  Note that because of\n        limitations in the protocol there is no way to get the current\n        subdomain and real `server_name` from the environment.  If you don't\n        provide it, Werkzeug will use `SERVER_NAME` and `SERVER_PORT` (or\n        `HTTP_HOST` if provided) as used `server_name` with disabled subdomain\n        feature.\n\n        If `subdomain` is `None` but an environment and a server name is\n        provided it will calculate the current subdomain automatically.\n        Example: `server_name` is ``'example.com'`` and the `SERVER_NAME`\n        in the wsgi `environ` is ``'staging.dev.example.com'`` the calculated\n        subdomain will be ``'staging.dev'``.\n\n        If the object passed as environ has an environ attribute, the value of\n        this attribute is used instead.  This allows you to pass request\n        objects.  Additionally `PATH_INFO` added as a default of the\n        :class:`MapAdapter` so that you don't have to pass the path info to\n        the match method.\n\n        .. versionchanged:: 0.5\n            previously this method accepted a bogus `calculate_subdomain`\n            parameter that did not have any effect.  It was removed because\n            of that.\n\n        .. versionchanged:: 0.8\n           This will no longer raise a ValueError when an unexpected server\n           name was passed.\n\n        :param environ: a WSGI environment.\n        :param server_name: an optional server name hint (see above).\n        :param subdomain: optionally the current subdomain (see above).\n        \"\"\"\n        environ = _get_environ(environ)\n\n        if 'HTTP_HOST' in environ:\n            wsgi_server_name = environ['HTTP_HOST']\n\n            if environ['wsgi.url_scheme'] == 'http' \\\n                    and wsgi_server_name.endswith(':80'):\n                wsgi_server_name = wsgi_server_name[:-3]\n            elif environ['wsgi.url_scheme'] == 'https' \\\n                    and wsgi_server_name.endswith(':443'):\n                wsgi_server_name = wsgi_server_name[:-4]\n        else:\n            wsgi_server_name = environ['SERVER_NAME']\n\n            if (environ['wsgi.url_scheme'], environ['SERVER_PORT']) not \\\n               in (('https', '443'), ('http', '80')):\n                wsgi_server_name += ':' + environ['SERVER_PORT']\n\n        wsgi_server_name = wsgi_server_name.lower()\n\n        if server_name is None:\n            server_name = wsgi_server_name\n        else:\n            server_name = server_name.lower()\n\n        if subdomain is None and not self.host_matching:\n            cur_server_name = wsgi_server_name.split('.')\n            real_server_name = server_name.split('.')\n            offset = -len(real_server_name)\n            if cur_server_name[offset:] != real_server_name:\n                # This can happen even with valid configs if the server was\n                # accesssed directly by IP address under some situations.\n                # Instead of raising an exception like in Werkzeug 0.7 or\n                # earlier we go by an invalid subdomain which will result\n                # in a 404 error on matching.\n                subdomain = '<invalid>'\n            else:\n                subdomain = '.'.join(filter(None, cur_server_name[:offset]))\n\n        def _get_wsgi_string(name):\n            val = environ.get(name)\n            if val is not None:\n                return wsgi_decoding_dance(val, self.charset)\n\n        script_name = _get_wsgi_string('SCRIPT_NAME')\n        path_info = _get_wsgi_string('PATH_INFO')\n        query_args = _get_wsgi_string('QUERY_STRING')\n        return Map.bind(self, server_name, script_name,\n                        subdomain, environ['wsgi.url_scheme'],\n                        environ['REQUEST_METHOD'], path_info,\n                        query_args=query_args)\n\n    def update(self):\n        \"\"\"Called before matching and building to keep the compiled rules\n        in the correct order after things changed.\n        \"\"\"\n        if not self._remap:\n            return\n\n        with self._remap_lock:\n            if not self._remap:\n                return\n\n            self._rules.sort(key=lambda x: x.match_compare_key())\n            for rules in itervalues(self._rules_by_endpoint):\n                rules.sort(key=lambda x: x.build_compare_key())\n            self._remap = False\n\n    def __repr__(self):\n        rules = self.iter_rules()\n        return '%s(%s)' % (self.__class__.__name__, pformat(list(rules)))\n\n\nclass MapAdapter(object):\n\n    \"\"\"Returned by :meth:`Map.bind` or :meth:`Map.bind_to_environ` and does\n    the URL matching and building based on runtime information.\n    \"\"\"\n\n    def __init__(self, map, server_name, script_name, subdomain,\n                 url_scheme, path_info, default_method, query_args=None):\n        self.map = map\n        self.server_name = to_unicode(server_name)\n        script_name = to_unicode(script_name)\n        if not script_name.endswith(u'/'):\n            script_name += u'/'\n        self.script_name = script_name\n        self.subdomain = to_unicode(subdomain)\n        self.url_scheme = to_unicode(url_scheme)\n        self.path_info = to_unicode(path_info)\n        self.default_method = to_unicode(default_method)\n        self.query_args = query_args\n\n    def dispatch(self, view_func, path_info=None, method=None,\n                 catch_http_exceptions=False):\n        \"\"\"Does the complete dispatching process.  `view_func` is called with\n        the endpoint and a dict with the values for the view.  It should\n        look up the view function, call it, and return a response object\n        or WSGI application.  http exceptions are not caught by default\n        so that applications can display nicer error messages by just\n        catching them by hand.  If you want to stick with the default\n        error messages you can pass it ``catch_http_exceptions=True`` and\n        it will catch the http exceptions.\n\n        Here a small example for the dispatch usage::\n\n            from werkzeug.wrappers import Request, Response\n            from werkzeug.wsgi import responder\n            from werkzeug.routing import Map, Rule\n\n            def on_index(request):\n                return Response('Hello from the index')\n\n            url_map = Map([Rule('/', endpoint='index')])\n            views = {'index': on_index}\n\n            @responder\n            def application(environ, start_response):\n                request = Request(environ)\n                urls = url_map.bind_to_environ(environ)\n                return urls.dispatch(lambda e, v: views[e](request, **v),\n                                     catch_http_exceptions=True)\n\n        Keep in mind that this method might return exception objects, too, so\n        use :class:`Response.force_type` to get a response object.\n\n        :param view_func: a function that is called with the endpoint as\n                          first argument and the value dict as second.  Has\n                          to dispatch to the actual view function with this\n                          information.  (see above)\n        :param path_info: the path info to use for matching.  Overrides the\n                          path info specified on binding.\n        :param method: the HTTP method used for matching.  Overrides the\n                       method specified on binding.\n        :param catch_http_exceptions: set to `True` to catch any of the\n                                      werkzeug :class:`HTTPException`\\s.\n        \"\"\"\n        try:\n            try:\n                endpoint, args = self.match(path_info, method)\n            except RequestRedirect as e:\n                return e\n            return view_func(endpoint, args)\n        except HTTPException as e:\n            if catch_http_exceptions:\n                return e\n            raise\n\n    def match(self, path_info=None, method=None, return_rule=False,\n              query_args=None):\n        \"\"\"The usage is simple: you just pass the match method the current\n        path info as well as the method (which defaults to `GET`).  The\n        following things can then happen:\n\n        - you receive a `NotFound` exception that indicates that no URL is\n          matching.  A `NotFound` exception is also a WSGI application you\n          can call to get a default page not found page (happens to be the\n          same object as `werkzeug.exceptions.NotFound`)\n\n        - you receive a `MethodNotAllowed` exception that indicates that there\n          is a match for this URL but not for the current request method.\n          This is useful for RESTful applications.\n\n        - you receive a `RequestRedirect` exception with a `new_url`\n          attribute.  This exception is used to notify you about a request\n          Werkzeug requests from your WSGI application.  This is for example the\n          case if you request ``/foo`` although the correct URL is ``/foo/``\n          You can use the `RequestRedirect` instance as response-like object\n          similar to all other subclasses of `HTTPException`.\n\n        - you get a tuple in the form ``(endpoint, arguments)`` if there is\n          a match (unless `return_rule` is True, in which case you get a tuple\n          in the form ``(rule, arguments)``)\n\n        If the path info is not passed to the match method the default path\n        info of the map is used (defaults to the root URL if not defined\n        explicitly).\n\n        All of the exceptions raised are subclasses of `HTTPException` so they\n        can be used as WSGI responses.  The will all render generic error or\n        redirect pages.\n\n        Here is a small example for matching:\n\n        >>> m = Map([\n        ...     Rule('/', endpoint='index'),\n        ...     Rule('/downloads/', endpoint='downloads/index'),\n        ...     Rule('/downloads/<int:id>', endpoint='downloads/show')\n        ... ])\n        >>> urls = m.bind(\"example.com\", \"/\")\n        >>> urls.match(\"/\", \"GET\")\n        ('index', {})\n        >>> urls.match(\"/downloads/42\")\n        ('downloads/show', {'id': 42})\n\n        And here is what happens on redirect and missing URLs:\n\n        >>> urls.match(\"/downloads\")\n        Traceback (most recent call last):\n          ...\n        RequestRedirect: http://example.com/downloads/\n        >>> urls.match(\"/missing\")\n        Traceback (most recent call last):\n          ...\n        NotFound: 404 Not Found\n\n        :param path_info: the path info to use for matching.  Overrides the\n                          path info specified on binding.\n        :param method: the HTTP method used for matching.  Overrides the\n                       method specified on binding.\n        :param return_rule: return the rule that matched instead of just the\n                            endpoint (defaults to `False`).\n        :param query_args: optional query arguments that are used for\n                           automatic redirects as string or dictionary.  It's\n                           currently not possible to use the query arguments\n                           for URL matching.\n\n        .. versionadded:: 0.6\n           `return_rule` was added.\n\n        .. versionadded:: 0.7\n           `query_args` was added.\n\n        .. versionchanged:: 0.8\n           `query_args` can now also be a string.\n        \"\"\"\n        self.map.update()\n        if path_info is None:\n            path_info = self.path_info\n        else:\n            path_info = to_unicode(path_info, self.map.charset)\n        if query_args is None:\n            query_args = self.query_args\n        method = (method or self.default_method).upper()\n\n        path = u'%s|%s' % (\n            self.map.host_matching and self.server_name or self.subdomain,\n            path_info and '/%s' % path_info.lstrip('/')\n        )\n\n        have_match_for = set()\n        for rule in self.map._rules:\n            try:\n                rv = rule.match(path)\n            except RequestSlash:\n                raise RequestRedirect(self.make_redirect_url(\n                    url_quote(path_info, self.map.charset,\n                              safe='/:|+') + '/', query_args))\n            except RequestAliasRedirect as e:\n                raise RequestRedirect(self.make_alias_redirect_url(\n                    path, rule.endpoint, e.matched_values, method, query_args))\n            if rv is None:\n                continue\n            if rule.methods is not None and method not in rule.methods:\n                have_match_for.update(rule.methods)\n                continue\n\n            if self.map.redirect_defaults:\n                redirect_url = self.get_default_redirect(rule, method, rv,\n                                                         query_args)\n                if redirect_url is not None:\n                    raise RequestRedirect(redirect_url)\n\n            if rule.redirect_to is not None:\n                if isinstance(rule.redirect_to, string_types):\n                    def _handle_match(match):\n                        value = rv[match.group(1)]\n                        return rule._converters[match.group(1)].to_url(value)\n                    redirect_url = _simple_rule_re.sub(_handle_match,\n                                                       rule.redirect_to)\n                else:\n                    redirect_url = rule.redirect_to(self, **rv)\n                raise RequestRedirect(str(url_join('%s://%s%s%s' % (\n                    self.url_scheme or 'http',\n                    self.subdomain and self.subdomain + '.' or '',\n                    self.server_name,\n                    self.script_name\n                ), redirect_url)))\n\n            if return_rule:\n                return rule, rv\n            else:\n                return rule.endpoint, rv\n\n        if have_match_for:\n            raise MethodNotAllowed(valid_methods=list(have_match_for))\n        raise NotFound()\n\n    def test(self, path_info=None, method=None):\n        \"\"\"Test if a rule would match.  Works like `match` but returns `True`\n        if the URL matches, or `False` if it does not exist.\n\n        :param path_info: the path info to use for matching.  Overrides the\n                          path info specified on binding.\n        :param method: the HTTP method used for matching.  Overrides the\n                       method specified on binding.\n        \"\"\"\n        try:\n            self.match(path_info, method)\n        except RequestRedirect:\n            pass\n        except HTTPException:\n            return False\n        return True\n\n    def allowed_methods(self, path_info=None):\n        \"\"\"Returns the valid methods that match for a given path.\n\n        .. versionadded:: 0.7\n        \"\"\"\n        try:\n            self.match(path_info, method='--')\n        except MethodNotAllowed as e:\n            return e.valid_methods\n        except HTTPException as e:\n            pass\n        return []\n\n    def get_host(self, domain_part):\n        \"\"\"Figures out the full host name for the given domain part.  The\n        domain part is a subdomain in case host matching is disabled or\n        a full host name.\n        \"\"\"\n        if self.map.host_matching:\n            if domain_part is None:\n                return self.server_name\n            return to_unicode(domain_part, 'ascii')\n        subdomain = domain_part\n        if subdomain is None:\n            subdomain = self.subdomain\n        else:\n            subdomain = to_unicode(subdomain, 'ascii')\n        return (subdomain and subdomain + u'.' or u'') + self.server_name\n\n    def get_default_redirect(self, rule, method, values, query_args):\n        \"\"\"A helper that returns the URL to redirect to if it finds one.\n        This is used for default redirecting only.\n\n        :internal:\n        \"\"\"\n        assert self.map.redirect_defaults\n        for r in self.map._rules_by_endpoint[rule.endpoint]:\n            # every rule that comes after this one, including ourself\n            # has a lower priority for the defaults.  We order the ones\n            # with the highest priority up for building.\n            if r is rule:\n                break\n            if r.provides_defaults_for(rule) and \\\n               r.suitable_for(values, method):\n                values.update(r.defaults)\n                domain_part, path = r.build(values)\n                return self.make_redirect_url(\n                    path, query_args, domain_part=domain_part)\n\n    def encode_query_args(self, query_args):\n        if not isinstance(query_args, string_types):\n            query_args = url_encode(query_args, self.map.charset)\n        return query_args\n\n    def make_redirect_url(self, path_info, query_args=None, domain_part=None):\n        \"\"\"Creates a redirect URL.\n\n        :internal:\n        \"\"\"\n        suffix = ''\n        if query_args:\n            suffix = '?' + self.encode_query_args(query_args)\n        return str('%s://%s/%s%s' % (\n            self.url_scheme or 'http',\n            self.get_host(domain_part),\n            posixpath.join(self.script_name[:-1].lstrip('/'),\n                           path_info.lstrip('/')),\n            suffix\n        ))\n\n    def make_alias_redirect_url(self, path, endpoint, values, method, query_args):\n        \"\"\"Internally called to make an alias redirect URL.\"\"\"\n        url = self.build(endpoint, values, method, append_unknown=False,\n                         force_external=True)\n        if query_args:\n            url += '?' + self.encode_query_args(query_args)\n        assert url != path, 'detected invalid alias setting.  No canonical ' \\\n            'URL found'\n        return url\n\n    def _partial_build(self, endpoint, values, method, append_unknown):\n        \"\"\"Helper for :meth:`build`.  Returns subdomain and path for the\n        rule that accepts this endpoint, values and method.\n\n        :internal:\n        \"\"\"\n        # in case the method is none, try with the default method first\n        if method is None:\n            rv = self._partial_build(endpoint, values, self.default_method,\n                                     append_unknown)\n            if rv is not None:\n                return rv\n\n        # default method did not match or a specific method is passed,\n        # check all and go with first result.\n        for rule in self.map._rules_by_endpoint.get(endpoint, ()):\n            if rule.suitable_for(values, method):\n                rv = rule.build(values, append_unknown)\n                if rv is not None:\n                    return rv\n\n    def build(self, endpoint, values=None, method=None, force_external=False,\n              append_unknown=True):\n        \"\"\"Building URLs works pretty much the other way round.  Instead of\n        `match` you call `build` and pass it the endpoint and a dict of\n        arguments for the placeholders.\n\n        The `build` function also accepts an argument called `force_external`\n        which, if you set it to `True` will force external URLs. Per default\n        external URLs (include the server name) will only be used if the\n        target URL is on a different subdomain.\n\n        >>> m = Map([\n        ...     Rule('/', endpoint='index'),\n        ...     Rule('/downloads/', endpoint='downloads/index'),\n        ...     Rule('/downloads/<int:id>', endpoint='downloads/show')\n        ... ])\n        >>> urls = m.bind(\"example.com\", \"/\")\n        >>> urls.build(\"index\", {})\n        '/'\n        >>> urls.build(\"downloads/show\", {'id': 42})\n        '/downloads/42'\n        >>> urls.build(\"downloads/show\", {'id': 42}, force_external=True)\n        'http://example.com/downloads/42'\n\n        Because URLs cannot contain non ASCII data you will always get\n        bytestrings back.  Non ASCII characters are urlencoded with the\n        charset defined on the map instance.\n\n        Additional values are converted to unicode and appended to the URL as\n        URL querystring parameters:\n\n        >>> urls.build(\"index\", {'q': 'My Searchstring'})\n        '/?q=My+Searchstring'\n\n        When processing those additional values, lists are furthermore\n        interpreted as multiple values (as per\n        :py:class:`werkzeug.datastructures.MultiDict`):\n\n        >>> urls.build(\"index\", {'q': ['a', 'b', 'c']})\n        '/?q=a&q=b&q=c'\n\n        If a rule does not exist when building a `BuildError` exception is\n        raised.\n\n        The build method accepts an argument called `method` which allows you\n        to specify the method you want to have an URL built for if you have\n        different methods for the same endpoint specified.\n\n        .. versionadded:: 0.6\n           the `append_unknown` parameter was added.\n\n        :param endpoint: the endpoint of the URL to build.\n        :param values: the values for the URL to build.  Unhandled values are\n                       appended to the URL as query parameters.\n        :param method: the HTTP method for the rule if there are different\n                       URLs for different methods on the same endpoint.\n        :param force_external: enforce full canonical external URLs. If the URL\n                               scheme is not provided, this will generate\n                               a protocol-relative URL.\n        :param append_unknown: unknown parameters are appended to the generated\n                               URL as query string argument.  Disable this\n                               if you want the builder to ignore those.\n        \"\"\"\n        self.map.update()\n        if values:\n            if isinstance(values, MultiDict):\n                valueiter = iteritems(values, multi=True)\n            else:\n                valueiter = iteritems(values)\n            values = dict((k, v) for k, v in valueiter if v is not None)\n        else:\n            values = {}\n\n        rv = self._partial_build(endpoint, values, method, append_unknown)\n        if rv is None:\n            raise BuildError(endpoint, values, method, self)\n        domain_part, path = rv\n\n        host = self.get_host(domain_part)\n\n        # shortcut this.\n        if not force_external and (\n            (self.map.host_matching and host == self.server_name) or\n            (not self.map.host_matching and domain_part == self.subdomain)\n        ):\n            return str(url_join(self.script_name, './' + path.lstrip('/')))\n        return str('%s//%s%s/%s' % (\n            self.url_scheme + ':' if self.url_scheme else '',\n            host,\n            self.script_name[:-1],\n            path.lstrip('/')\n        ))\n"
  },
  {
    "path": "lib/werkzeug/script.py",
    "content": "# -*- coding: utf-8 -*-\nr'''\n    werkzeug.script\n    ~~~~~~~~~~~~~~~\n\n    .. admonition:: Deprecated Functionality\n\n       ``werkzeug.script`` is deprecated without replacement functionality.\n       Python's command line support improved greatly with :mod:`argparse`\n       and a bunch of alternative modules.\n\n    Most of the time you have recurring tasks while writing an application\n    such as starting up an interactive python interpreter with some prefilled\n    imports, starting the development server, initializing the database or\n    something similar.\n\n    For that purpose werkzeug provides the `werkzeug.script` module which\n    helps you writing such scripts.\n\n\n    Basic Usage\n    -----------\n\n    The following snippet is roughly the same in every werkzeug script::\n\n        #!/usr/bin/env python\n        # -*- coding: utf-8 -*-\n        from werkzeug import script\n\n        # actions go here\n\n        if __name__ == '__main__':\n            script.run()\n\n    Starting this script now does nothing because no actions are defined.\n    An action is a function in the same module starting with ``\"action_\"``\n    which takes a number of arguments where every argument has a default.  The\n    type of the default value specifies the type of the argument.\n\n    Arguments can then be passed by position or using ``--name=value`` from\n    the shell.\n\n    Because a runserver and shell command is pretty common there are two\n    factory functions that create such commands::\n\n        def make_app():\n            from yourapplication import YourApplication\n            return YourApplication(...)\n\n        action_runserver = script.make_runserver(make_app, use_reloader=True)\n        action_shell = script.make_shell(lambda: {'app': make_app()})\n\n\n    Using The Scripts\n    -----------------\n\n    The script from above can be used like this from the shell now:\n\n    .. sourcecode:: text\n\n        $ ./manage.py --help\n        $ ./manage.py runserver localhost 8080 --debugger --no-reloader\n        $ ./manage.py runserver -p 4000\n        $ ./manage.py shell\n\n    As you can see it's possible to pass parameters as positional arguments\n    or as named parameters, pretty much like Python function calls.\n\n\n    :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details.\n    :license: BSD, see LICENSE for more details.\n'''\nfrom __future__ import print_function\n\nimport sys\nimport inspect\nimport getopt\nfrom os.path import basename\nfrom werkzeug._compat import iteritems\n\n\nargument_types = {\n    bool:       'boolean',\n    str:        'string',\n    int:        'integer',\n    float:      'float'\n}\n\n\nconverters = {\n    'boolean': lambda x: x.lower() in ('1', 'true', 'yes', 'on'),\n    'string':   str,\n    'integer':  int,\n    'float':    float\n}\n\n\ndef run(namespace=None, action_prefix='action_', args=None):\n    \"\"\"Run the script.  Participating actions are looked up in the caller's\n    namespace if no namespace is given, otherwise in the dict provided.\n    Only items that start with action_prefix are processed as actions.  If\n    you want to use all items in the namespace provided as actions set\n    action_prefix to an empty string.\n\n    :param namespace: An optional dict where the functions are looked up in.\n                      By default the local namespace of the caller is used.\n    :param action_prefix: The prefix for the functions.  Everything else\n                          is ignored.\n    :param args: the arguments for the function.  If not specified\n                 :data:`sys.argv` without the first argument is used.\n    \"\"\"\n    if namespace is None:\n        namespace = sys._getframe(1).f_locals\n    actions = find_actions(namespace, action_prefix)\n\n    if args is None:\n        args = sys.argv[1:]\n    if not args or args[0] in ('-h', '--help'):\n        return print_usage(actions)\n    elif args[0] not in actions:\n        fail('Unknown action \\'%s\\'' % args[0])\n\n    arguments = {}\n    types = {}\n    key_to_arg = {}\n    long_options = []\n    formatstring = ''\n    func, doc, arg_def = actions[args.pop(0)]\n    for idx, (arg, shortcut, default, option_type) in enumerate(arg_def):\n        real_arg = arg.replace('-', '_')\n        if shortcut:\n            formatstring += shortcut\n            if not isinstance(default, bool):\n                formatstring += ':'\n            key_to_arg['-' + shortcut] = real_arg\n        long_options.append(isinstance(default, bool) and arg or arg + '=')\n        key_to_arg['--' + arg] = real_arg\n        key_to_arg[idx] = real_arg\n        types[real_arg] = option_type\n        arguments[real_arg] = default\n\n    try:\n        optlist, posargs = getopt.gnu_getopt(args, formatstring, long_options)\n    except getopt.GetoptError as e:\n        fail(str(e))\n\n    specified_arguments = set()\n    for key, value in enumerate(posargs):\n        try:\n            arg = key_to_arg[key]\n        except IndexError:\n            fail('Too many parameters')\n        specified_arguments.add(arg)\n        try:\n            arguments[arg] = converters[types[arg]](value)\n        except ValueError:\n            fail('Invalid value for argument %s (%s): %s' % (key, arg, value))\n\n    for key, value in optlist:\n        arg = key_to_arg[key]\n        if arg in specified_arguments:\n            fail('Argument \\'%s\\' is specified twice' % arg)\n        if types[arg] == 'boolean':\n            if arg.startswith('no_'):\n                value = 'no'\n            else:\n                value = 'yes'\n        try:\n            arguments[arg] = converters[types[arg]](value)\n        except ValueError:\n            fail('Invalid value for \\'%s\\': %s' % (key, value))\n\n    newargs = {}\n    for k, v in iteritems(arguments):\n        newargs[k.startswith('no_') and k[3:] or k] = v\n    arguments = newargs\n    return func(**arguments)\n\n\ndef fail(message, code=-1):\n    \"\"\"Fail with an error.\"\"\"\n    print('Error: %s' % message, file=sys.stderr)\n    sys.exit(code)\n\n\ndef find_actions(namespace, action_prefix):\n    \"\"\"Find all the actions in the namespace.\"\"\"\n    actions = {}\n    for key, value in iteritems(namespace):\n        if key.startswith(action_prefix):\n            actions[key[len(action_prefix):]] = analyse_action(value)\n    return actions\n\n\ndef print_usage(actions):\n    \"\"\"Print the usage information.  (Help screen)\"\"\"\n    actions = sorted(iteritems(actions))\n    print('usage: %s <action> [<options>]' % basename(sys.argv[0]))\n    print('       %s --help' % basename(sys.argv[0]))\n    print()\n    print('actions:')\n    for name, (func, doc, arguments) in actions:\n        print('  %s:' % name)\n        for line in doc.splitlines():\n            print('    %s' % line)\n        if arguments:\n            print()\n        for arg, shortcut, default, argtype in arguments:\n            if isinstance(default, bool):\n                print('    %s' % (\n                    (shortcut and '-%s, ' % shortcut or '') + '--' + arg\n                ))\n            else:\n                print('    %-30s%-10s%s' % (\n                    (shortcut and '-%s, ' % shortcut or '') + '--' + arg,\n                    argtype, default\n                ))\n        print()\n\n\ndef analyse_action(func):\n    \"\"\"Analyse a function.\"\"\"\n    description = inspect.getdoc(func) or 'undocumented action'\n    arguments = []\n    args, varargs, kwargs, defaults = inspect.getargspec(func)\n    if varargs or kwargs:\n        raise TypeError('variable length arguments for action not allowed.')\n    if len(args) != len(defaults or ()):\n        raise TypeError('not all arguments have proper definitions')\n\n    for idx, (arg, definition) in enumerate(zip(args, defaults or ())):\n        if arg.startswith('_'):\n            raise TypeError('arguments may not start with an underscore')\n        if not isinstance(definition, tuple):\n            shortcut = None\n            default = definition\n        else:\n            shortcut, default = definition\n        argument_type = argument_types[type(default)]\n        if isinstance(default, bool) and default is True:\n            arg = 'no-' + arg\n        arguments.append((arg.replace('_', '-'), shortcut,\n                          default, argument_type))\n    return func, description, arguments\n\n\ndef make_shell(init_func=None, banner=None, use_ipython=True):\n    \"\"\"Returns an action callback that spawns a new interactive\n    python shell.\n\n    :param init_func: an optional initialization function that is\n                      called before the shell is started.  The return\n                      value of this function is the initial namespace.\n    :param banner: the banner that is displayed before the shell.  If\n                   not specified a generic banner is used instead.\n    :param use_ipython: if set to `True` ipython is used if available.\n    \"\"\"\n    if banner is None:\n        banner = 'Interactive Werkzeug Shell'\n    if init_func is None:\n        init_func = dict\n\n    def action(ipython=use_ipython):\n        \"\"\"Start a new interactive python session.\"\"\"\n        namespace = init_func()\n        if ipython:\n            try:\n                try:\n                    from IPython.frontend.terminal.embed import InteractiveShellEmbed\n                    sh = InteractiveShellEmbed(banner1=banner)\n                except ImportError:\n                    from IPython.Shell import IPShellEmbed\n                    sh = IPShellEmbed(banner=banner)\n            except ImportError:\n                pass\n            else:\n                sh(global_ns={}, local_ns=namespace)\n                return\n        from code import interact\n        interact(banner, local=namespace)\n    return action\n\n\ndef make_runserver(app_factory, hostname='localhost', port=5000,\n                   use_reloader=False, use_debugger=False, use_evalex=True,\n                   threaded=False, processes=1, static_files=None,\n                   extra_files=None, ssl_context=None):\n    \"\"\"Returns an action callback that spawns a new development server.\n\n    .. versionadded:: 0.5\n       `static_files` and `extra_files` was added.\n\n    ..versionadded:: 0.6.1\n       `ssl_context` was added.\n\n    :param app_factory: a function that returns a new WSGI application.\n    :param hostname: the default hostname the server should listen on.\n    :param port: the default port of the server.\n    :param use_reloader: the default setting for the reloader.\n    :param use_evalex: the default setting for the evalex flag of the debugger.\n    :param threaded: the default threading setting.\n    :param processes: the default number of processes to start.\n    :param static_files: optional dict of static files.\n    :param extra_files: optional list of extra files to track for reloading.\n    :param ssl_context: optional SSL context for running server in HTTPS mode.\n    \"\"\"\n    def action(hostname=('h', hostname), port=('p', port),\n               reloader=use_reloader, debugger=use_debugger,\n               evalex=use_evalex, threaded=threaded, processes=processes):\n        \"\"\"Start a new development server.\"\"\"\n        from werkzeug.serving import run_simple\n        app = app_factory()\n        run_simple(hostname, port, app,\n                   use_reloader=reloader, use_debugger=debugger,\n                   use_evalex=evalex, extra_files=extra_files,\n                   reloader_interval=1, threaded=threaded, processes=processes,\n                   static_files=static_files, ssl_context=ssl_context)\n    return action\n"
  },
  {
    "path": "lib/werkzeug/security.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    werkzeug.security\n    ~~~~~~~~~~~~~~~~~\n\n    Security related helpers such as secure password hashing tools.\n\n    :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nimport os\nimport hmac\nimport hashlib\nimport posixpath\nimport codecs\nfrom struct import Struct\nfrom random import SystemRandom\nfrom operator import xor\nfrom itertools import starmap\n\nfrom werkzeug._compat import range_type, PY2, text_type, izip, to_bytes, \\\n    string_types, to_native\n\n\nSALT_CHARS = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'\nDEFAULT_PBKDF2_ITERATIONS = 1000\n\n\n_pack_int = Struct('>I').pack\n_builtin_safe_str_cmp = getattr(hmac, 'compare_digest', None)\n_sys_rng = SystemRandom()\n_os_alt_seps = list(sep for sep in [os.path.sep, os.path.altsep]\n                    if sep not in (None, '/'))\n\n\ndef _find_hashlib_algorithms():\n    algos = getattr(hashlib, 'algorithms', None)\n    if algos is None:\n        algos = ('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512')\n    rv = {}\n    for algo in algos:\n        func = getattr(hashlib, algo, None)\n        if func is not None:\n            rv[algo] = func\n    return rv\n_hash_funcs = _find_hashlib_algorithms()\n\n\ndef pbkdf2_hex(data, salt, iterations=DEFAULT_PBKDF2_ITERATIONS,\n               keylen=None, hashfunc=None):\n    \"\"\"Like :func:`pbkdf2_bin`, but returns a hex-encoded string.\n\n    .. versionadded:: 0.9\n\n    :param data: the data to derive.\n    :param salt: the salt for the derivation.\n    :param iterations: the number of iterations.\n    :param keylen: the length of the resulting key.  If not provided,\n                   the digest size will be used.\n    :param hashfunc: the hash function to use.  This can either be the\n                     string name of a known hash function, or a function\n                     from the hashlib module.  Defaults to sha1.\n    \"\"\"\n    rv = pbkdf2_bin(data, salt, iterations, keylen, hashfunc)\n    return to_native(codecs.encode(rv, 'hex_codec'))\n\n\n_has_native_pbkdf2 = hasattr(hashlib, 'pbkdf2_hmac')\n\n\ndef pbkdf2_bin(data, salt, iterations=DEFAULT_PBKDF2_ITERATIONS,\n               keylen=None, hashfunc=None):\n    \"\"\"Returns a binary digest for the PBKDF2 hash algorithm of `data`\n    with the given `salt`. It iterates `iterations` times and produces a\n    key of `keylen` bytes. By default, SHA-1 is used as hash function;\n    a different hashlib `hashfunc` can be provided.\n\n    .. versionadded:: 0.9\n\n    :param data: the data to derive.\n    :param salt: the salt for the derivation.\n    :param iterations: the number of iterations.\n    :param keylen: the length of the resulting key.  If not provided\n                   the digest size will be used.\n    :param hashfunc: the hash function to use.  This can either be the\n                     string name of a known hash function or a function\n                     from the hashlib module.  Defaults to sha1.\n    \"\"\"\n    if isinstance(hashfunc, string_types):\n        hashfunc = _hash_funcs[hashfunc]\n    elif not hashfunc:\n        hashfunc = hashlib.sha1\n    data = to_bytes(data)\n    salt = to_bytes(salt)\n\n    # If we're on Python with pbkdf2_hmac we can try to use it for\n    # compatible digests.\n    if _has_native_pbkdf2:\n        _test_hash = hashfunc()\n        if hasattr(_test_hash, 'name') and \\\n           _test_hash.name in _hash_funcs:\n            return hashlib.pbkdf2_hmac(_test_hash.name,\n                                       data, salt, iterations,\n                                       keylen)\n\n    mac = hmac.HMAC(data, None, hashfunc)\n    if not keylen:\n        keylen = mac.digest_size\n\n    def _pseudorandom(x, mac=mac):\n        h = mac.copy()\n        h.update(x)\n        return bytearray(h.digest())\n    buf = bytearray()\n    for block in range_type(1, -(-keylen // mac.digest_size) + 1):\n        rv = u = _pseudorandom(salt + _pack_int(block))\n        for i in range_type(iterations - 1):\n            u = _pseudorandom(bytes(u))\n            rv = bytearray(starmap(xor, izip(rv, u)))\n        buf.extend(rv)\n    return bytes(buf[:keylen])\n\n\ndef safe_str_cmp(a, b):\n    \"\"\"This function compares strings in somewhat constant time.  This\n    requires that the length of at least one string is known in advance.\n\n    Returns `True` if the two strings are equal, or `False` if they are not.\n\n    .. versionadded:: 0.7\n    \"\"\"\n    if isinstance(a, text_type):\n        a = a.encode('utf-8')\n    if isinstance(b, text_type):\n        b = b.encode('utf-8')\n\n    if _builtin_safe_str_cmp is not None:\n        return _builtin_safe_str_cmp(a, b)\n\n    if len(a) != len(b):\n        return False\n\n    rv = 0\n    if PY2:\n        for x, y in izip(a, b):\n            rv |= ord(x) ^ ord(y)\n    else:\n        for x, y in izip(a, b):\n            rv |= x ^ y\n\n    return rv == 0\n\n\ndef gen_salt(length):\n    \"\"\"Generate a random string of SALT_CHARS with specified ``length``.\"\"\"\n    if length <= 0:\n        raise ValueError('Salt length must be positive')\n    return ''.join(_sys_rng.choice(SALT_CHARS) for _ in range_type(length))\n\n\ndef _hash_internal(method, salt, password):\n    \"\"\"Internal password hash helper.  Supports plaintext without salt,\n    unsalted and salted passwords.  In case salted passwords are used\n    hmac is used.\n    \"\"\"\n    if method == 'plain':\n        return password, method\n\n    if isinstance(password, text_type):\n        password = password.encode('utf-8')\n\n    if method.startswith('pbkdf2:'):\n        args = method[7:].split(':')\n        if len(args) not in (1, 2):\n            raise ValueError('Invalid number of arguments for PBKDF2')\n        method = args.pop(0)\n        iterations = args and int(args[0] or 0) or DEFAULT_PBKDF2_ITERATIONS\n        is_pbkdf2 = True\n        actual_method = 'pbkdf2:%s:%d' % (method, iterations)\n    else:\n        is_pbkdf2 = False\n        actual_method = method\n\n    hash_func = _hash_funcs.get(method)\n    if hash_func is None:\n        raise TypeError('invalid method %r' % method)\n\n    if is_pbkdf2:\n        if not salt:\n            raise ValueError('Salt is required for PBKDF2')\n        rv = pbkdf2_hex(password, salt, iterations,\n                        hashfunc=hash_func)\n    elif salt:\n        if isinstance(salt, text_type):\n            salt = salt.encode('utf-8')\n        rv = hmac.HMAC(salt, password, hash_func).hexdigest()\n    else:\n        h = hash_func()\n        h.update(password)\n        rv = h.hexdigest()\n    return rv, actual_method\n\n\ndef generate_password_hash(password, method='pbkdf2:sha1', salt_length=8):\n    \"\"\"Hash a password with the given method and salt with with a string of\n    the given length.  The format of the string returned includes the method\n    that was used so that :func:`check_password_hash` can check the hash.\n\n    The format for the hashed string looks like this::\n\n        method$salt$hash\n\n    This method can **not** generate unsalted passwords but it is possible\n    to set the method to plain to enforce plaintext passwords.  If a salt\n    is used, hmac is used internally to salt the password.\n\n    If PBKDF2 is wanted it can be enabled by setting the method to\n    ``pbkdf2:method:iterations`` where iterations is optional::\n\n        pbkdf2:sha1:2000$salt$hash\n        pbkdf2:sha1$salt$hash\n\n    :param password: the password to hash.\n    :param method: the hash method to use (one that hashlib supports). Can\n                   optionally be in the format ``pbkdf2:<method>[:iterations]``\n                   to enable PBKDF2.\n    :param salt_length: the length of the salt in letters.\n    \"\"\"\n    salt = method != 'plain' and gen_salt(salt_length) or ''\n    h, actual_method = _hash_internal(method, salt, password)\n    return '%s$%s$%s' % (actual_method, salt, h)\n\n\ndef check_password_hash(pwhash, password):\n    \"\"\"check a password against a given salted and hashed password value.\n    In order to support unsalted legacy passwords this method supports\n    plain text passwords, md5 and sha1 hashes (both salted and unsalted).\n\n    Returns `True` if the password matched, `False` otherwise.\n\n    :param pwhash: a hashed string like returned by\n                   :func:`generate_password_hash`.\n    :param password: the plaintext password to compare against the hash.\n    \"\"\"\n    if pwhash.count('$') < 2:\n        return False\n    method, salt, hashval = pwhash.split('$', 2)\n    return safe_str_cmp(_hash_internal(method, salt, password)[0], hashval)\n\n\ndef safe_join(directory, filename):\n    \"\"\"Safely join `directory` and `filename`.  If this cannot be done,\n    this function returns ``None``.\n\n    :param directory: the base directory.\n    :param filename: the untrusted filename relative to that directory.\n    \"\"\"\n    filename = posixpath.normpath(filename)\n    for sep in _os_alt_seps:\n        if sep in filename:\n            return None\n    if os.path.isabs(filename) or filename.startswith('../'):\n        return None\n    return os.path.join(directory, filename)\n"
  },
  {
    "path": "lib/werkzeug/serving.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    werkzeug.serving\n    ~~~~~~~~~~~~~~~~\n\n    There are many ways to serve a WSGI application.  While you're developing\n    it you usually don't want a full blown webserver like Apache but a simple\n    standalone one.  From Python 2.5 onwards there is the `wsgiref`_ server in\n    the standard library.  If you're using older versions of Python you can\n    download the package from the cheeseshop.\n\n    However there are some caveats. Sourcecode won't reload itself when\n    changed and each time you kill the server using ``^C`` you get an\n    `KeyboardInterrupt` error.  While the latter is easy to solve the first\n    one can be a pain in the ass in some situations.\n\n    The easiest way is creating a small ``start-myproject.py`` that runs the\n    application::\n\n        #!/usr/bin/env python\n        # -*- coding: utf-8 -*-\n        from myproject import make_app\n        from werkzeug.serving import run_simple\n\n        app = make_app(...)\n        run_simple('localhost', 8080, app, use_reloader=True)\n\n    You can also pass it a `extra_files` keyword argument with a list of\n    additional files (like configuration files) you want to observe.\n\n    For bigger applications you should consider using `werkzeug.script`\n    instead of a simple start file.\n\n\n    :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nfrom __future__ import with_statement\n\nimport os\nimport socket\nimport sys\nimport signal\n\ntry:\n    import ssl\nexcept ImportError:\n    class _SslDummy(object):\n        def __getattr__(self, name):\n            raise RuntimeError('SSL support unavailable')\n    ssl = _SslDummy()\n\n\ndef _get_openssl_crypto_module():\n    try:\n        from OpenSSL import crypto\n    except ImportError:\n        raise TypeError('Using ad-hoc certificates requires the pyOpenSSL '\n                        'library.')\n    else:\n        return crypto\n\n\ntry:\n    from SocketServer import ThreadingMixIn, ForkingMixIn\n    from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler\nexcept ImportError:\n    from socketserver import ThreadingMixIn, ForkingMixIn\n    from http.server import HTTPServer, BaseHTTPRequestHandler\n\nimport werkzeug\nfrom werkzeug._internal import _log\nfrom werkzeug._compat import reraise, wsgi_encoding_dance\nfrom werkzeug.urls import url_parse, url_unquote\nfrom werkzeug.exceptions import InternalServerError\n\n\nLISTEN_QUEUE = 128\ncan_open_by_fd = hasattr(socket, 'fromfd')\n\n\nclass WSGIRequestHandler(BaseHTTPRequestHandler, object):\n\n    \"\"\"A request handler that implements WSGI dispatching.\"\"\"\n\n    @property\n    def server_version(self):\n        return 'Werkzeug/' + werkzeug.__version__\n\n    def make_environ(self):\n        request_url = url_parse(self.path)\n\n        def shutdown_server():\n            self.server.shutdown_signal = True\n\n        url_scheme = self.server.ssl_context is None and 'http' or 'https'\n        path_info = url_unquote(request_url.path)\n\n        environ = {\n            'wsgi.version':         (1, 0),\n            'wsgi.url_scheme':      url_scheme,\n            'wsgi.input':           self.rfile,\n            'wsgi.errors':          sys.stderr,\n            'wsgi.multithread':     self.server.multithread,\n            'wsgi.multiprocess':    self.server.multiprocess,\n            'wsgi.run_once':        False,\n            'werkzeug.server.shutdown': shutdown_server,\n            'SERVER_SOFTWARE':      self.server_version,\n            'REQUEST_METHOD':       self.command,\n            'SCRIPT_NAME':          '',\n            'PATH_INFO':            wsgi_encoding_dance(path_info),\n            'QUERY_STRING':         wsgi_encoding_dance(request_url.query),\n            'CONTENT_TYPE':         self.headers.get('Content-Type', ''),\n            'CONTENT_LENGTH':       self.headers.get('Content-Length', ''),\n            'REMOTE_ADDR':          self.client_address[0],\n            'REMOTE_PORT':          self.client_address[1],\n            'SERVER_NAME':          self.server.server_address[0],\n            'SERVER_PORT':          str(self.server.server_address[1]),\n            'SERVER_PROTOCOL':      self.request_version\n        }\n\n        for key, value in self.headers.items():\n            key = 'HTTP_' + key.upper().replace('-', '_')\n            if key not in ('HTTP_CONTENT_TYPE', 'HTTP_CONTENT_LENGTH'):\n                environ[key] = value\n\n        if request_url.netloc:\n            environ['HTTP_HOST'] = request_url.netloc\n\n        return environ\n\n    def run_wsgi(self):\n        if self.headers.get('Expect', '').lower().strip() == '100-continue':\n            self.wfile.write(b'HTTP/1.1 100 Continue\\r\\n\\r\\n')\n\n        self.environ = environ = self.make_environ()\n        headers_set = []\n        headers_sent = []\n\n        def write(data):\n            assert headers_set, 'write() before start_response'\n            if not headers_sent:\n                status, response_headers = headers_sent[:] = headers_set\n                try:\n                    code, msg = status.split(None, 1)\n                except ValueError:\n                    code, msg = status, \"\"\n                self.send_response(int(code), msg)\n                header_keys = set()\n                for key, value in response_headers:\n                    self.send_header(key, value)\n                    key = key.lower()\n                    header_keys.add(key)\n                if 'content-length' not in header_keys:\n                    self.close_connection = True\n                    self.send_header('Connection', 'close')\n                if 'server' not in header_keys:\n                    self.send_header('Server', self.version_string())\n                if 'date' not in header_keys:\n                    self.send_header('Date', self.date_time_string())\n                self.end_headers()\n\n            assert isinstance(data, bytes), 'applications must write bytes'\n            self.wfile.write(data)\n            self.wfile.flush()\n\n        def start_response(status, response_headers, exc_info=None):\n            if exc_info:\n                try:\n                    if headers_sent:\n                        reraise(*exc_info)\n                finally:\n                    exc_info = None\n            elif headers_set:\n                raise AssertionError('Headers already set')\n            headers_set[:] = [status, response_headers]\n            return write\n\n        def execute(app):\n            application_iter = app(environ, start_response)\n            try:\n                for data in application_iter:\n                    write(data)\n                if not headers_sent:\n                    write(b'')\n            finally:\n                if hasattr(application_iter, 'close'):\n                    application_iter.close()\n                application_iter = None\n\n        try:\n            execute(self.server.app)\n        except (socket.error, socket.timeout) as e:\n            self.connection_dropped(e, environ)\n        except Exception:\n            if self.server.passthrough_errors:\n                raise\n            from werkzeug.debug.tbtools import get_current_traceback\n            traceback = get_current_traceback(ignore_system_exceptions=True)\n            try:\n                # if we haven't yet sent the headers but they are set\n                # we roll back to be able to set them again.\n                if not headers_sent:\n                    del headers_set[:]\n                execute(InternalServerError())\n            except Exception:\n                pass\n            self.server.log('error', 'Error on request:\\n%s',\n                            traceback.plaintext)\n\n    def handle(self):\n        \"\"\"Handles a request ignoring dropped connections.\"\"\"\n        rv = None\n        try:\n            rv = BaseHTTPRequestHandler.handle(self)\n        except (socket.error, socket.timeout) as e:\n            self.connection_dropped(e)\n        except Exception:\n            if self.server.ssl_context is None or not is_ssl_error():\n                raise\n        if self.server.shutdown_signal:\n            self.initiate_shutdown()\n        return rv\n\n    def initiate_shutdown(self):\n        \"\"\"A horrible, horrible way to kill the server for Python 2.6 and\n        later.  It's the best we can do.\n        \"\"\"\n        # Windows does not provide SIGKILL, go with SIGTERM then.\n        sig = getattr(signal, 'SIGKILL', signal.SIGTERM)\n        # reloader active\n        if os.environ.get('WERKZEUG_RUN_MAIN') == 'true':\n            os.kill(os.getpid(), sig)\n        # python 2.7\n        self.server._BaseServer__shutdown_request = True\n        # python 2.6\n        self.server._BaseServer__serving = False\n\n    def connection_dropped(self, error, environ=None):\n        \"\"\"Called if the connection was closed by the client.  By default\n        nothing happens.\n        \"\"\"\n\n    def handle_one_request(self):\n        \"\"\"Handle a single HTTP request.\"\"\"\n        self.raw_requestline = self.rfile.readline()\n        if not self.raw_requestline:\n            self.close_connection = 1\n        elif self.parse_request():\n            return self.run_wsgi()\n\n    def send_response(self, code, message=None):\n        \"\"\"Send the response header and log the response code.\"\"\"\n        self.log_request(code)\n        if message is None:\n            message = code in self.responses and self.responses[code][0] or ''\n        if self.request_version != 'HTTP/0.9':\n            hdr = \"%s %d %s\\r\\n\" % (self.protocol_version, code, message)\n            self.wfile.write(hdr.encode('ascii'))\n\n    def version_string(self):\n        return BaseHTTPRequestHandler.version_string(self).strip()\n\n    def address_string(self):\n        return self.environ['REMOTE_ADDR']\n\n    def log_request(self, code='-', size='-'):\n        self.log('info', '\"%s\" %s %s', self.requestline, code, size)\n\n    def log_error(self, *args):\n        self.log('error', *args)\n\n    def log_message(self, format, *args):\n        self.log('info', format, *args)\n\n    def log(self, type, message, *args):\n        _log(type, '%s - - [%s] %s\\n' % (self.address_string(),\n                                         self.log_date_time_string(),\n                                         message % args))\n\n\n#: backwards compatible name if someone is subclassing it\nBaseRequestHandler = WSGIRequestHandler\n\n\ndef generate_adhoc_ssl_pair(cn=None):\n    from random import random\n    crypto = _get_openssl_crypto_module()\n\n    # pretty damn sure that this is not actually accepted by anyone\n    if cn is None:\n        cn = '*'\n\n    cert = crypto.X509()\n    cert.set_serial_number(int(random() * sys.maxsize))\n    cert.gmtime_adj_notBefore(0)\n    cert.gmtime_adj_notAfter(60 * 60 * 24 * 365)\n\n    subject = cert.get_subject()\n    subject.CN = cn\n    subject.O = 'Dummy Certificate'\n\n    issuer = cert.get_issuer()\n    issuer.CN = 'Untrusted Authority'\n    issuer.O = 'Self-Signed'\n\n    pkey = crypto.PKey()\n    pkey.generate_key(crypto.TYPE_RSA, 1024)\n    cert.set_pubkey(pkey)\n    cert.sign(pkey, 'md5')\n\n    return cert, pkey\n\n\ndef make_ssl_devcert(base_path, host=None, cn=None):\n    \"\"\"Creates an SSL key for development.  This should be used instead of\n    the ``'adhoc'`` key which generates a new cert on each server start.\n    It accepts a path for where it should store the key and cert and\n    either a host or CN.  If a host is given it will use the CN\n    ``*.host/CN=host``.\n\n    For more information see :func:`run_simple`.\n\n    .. versionadded:: 0.9\n\n    :param base_path: the path to the certificate and key.  The extension\n                      ``.crt`` is added for the certificate, ``.key`` is\n                      added for the key.\n    :param host: the name of the host.  This can be used as an alternative\n                 for the `cn`.\n    :param cn: the `CN` to use.\n    \"\"\"\n    from OpenSSL import crypto\n    if host is not None:\n        cn = '*.%s/CN=%s' % (host, host)\n    cert, pkey = generate_adhoc_ssl_pair(cn=cn)\n\n    cert_file = base_path + '.crt'\n    pkey_file = base_path + '.key'\n\n    with open(cert_file, 'wb') as f:\n        f.write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert))\n    with open(pkey_file, 'wb') as f:\n        f.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, pkey))\n\n    return cert_file, pkey_file\n\n\ndef generate_adhoc_ssl_context():\n    \"\"\"Generates an adhoc SSL context for the development server.\"\"\"\n    crypto = _get_openssl_crypto_module()\n    import tempfile\n    import atexit\n\n    cert, pkey = generate_adhoc_ssl_pair()\n    cert_handle, cert_file = tempfile.mkstemp()\n    pkey_handle, pkey_file = tempfile.mkstemp()\n    atexit.register(os.remove, pkey_file)\n    atexit.register(os.remove, cert_file)\n\n    os.write(cert_handle, crypto.dump_certificate(crypto.FILETYPE_PEM, cert))\n    os.write(pkey_handle, crypto.dump_privatekey(crypto.FILETYPE_PEM, pkey))\n    os.close(cert_handle)\n    os.close(pkey_handle)\n    ctx = load_ssl_context(cert_file, pkey_file)\n    return ctx\n\n\ndef load_ssl_context(cert_file, pkey_file=None, protocol=None):\n    \"\"\"Loads SSL context from cert/private key files and optional protocol.\n    Many parameters are directly taken from the API of\n    :py:class:`ssl.SSLContext`.\n\n    :param cert_file: Path of the certificate to use.\n    :param pkey_file: Path of the private key to use. If not given, the key\n                      will be obtained from the certificate file.\n    :param protocol: One of the ``PROTOCOL_*`` constants in the stdlib ``ssl``\n                     module. Defaults to ``PROTOCOL_SSLv23``.\n    \"\"\"\n    if protocol is None:\n        protocol = ssl.PROTOCOL_SSLv23\n    ctx = _SSLContext(protocol)\n    ctx.load_cert_chain(cert_file, pkey_file)\n    return ctx\n\n\nclass _SSLContext(object):\n\n    '''A dummy class with a small subset of Python3's ``ssl.SSLContext``, only\n    intended to be used with and by Werkzeug.'''\n\n    def __init__(self, protocol):\n        self._protocol = protocol\n        self._certfile = None\n        self._keyfile = None\n        self._password = None\n\n    def load_cert_chain(self, certfile, keyfile=None, password=None):\n        self._certfile = certfile\n        self._keyfile = keyfile or certfile\n        self._password = password\n\n    def wrap_socket(self, sock, **kwargs):\n        return ssl.wrap_socket(sock, keyfile=self._keyfile,\n                               certfile=self._certfile,\n                               ssl_version=self._protocol, **kwargs)\n\n\ndef is_ssl_error(error=None):\n    \"\"\"Checks if the given error (or the current one) is an SSL error.\"\"\"\n    exc_types = (ssl.SSLError,)\n    try:\n        from OpenSSL.SSL import Error\n        exc_types += (Error,)\n    except ImportError:\n        pass\n\n    if error is None:\n        error = sys.exc_info()[1]\n    return isinstance(error, exc_types)\n\n\ndef select_ip_version(host, port):\n    \"\"\"Returns AF_INET4 or AF_INET6 depending on where to connect to.\"\"\"\n    # disabled due to problems with current ipv6 implementations\n    # and various operating systems.  Probably this code also is\n    # not supposed to work, but I can't come up with any other\n    # ways to implement this.\n    # try:\n    #     info = socket.getaddrinfo(host, port, socket.AF_UNSPEC,\n    #                               socket.SOCK_STREAM, 0,\n    #                               socket.AI_PASSIVE)\n    #     if info:\n    #         return info[0][0]\n    # except socket.gaierror:\n    #     pass\n    if ':' in host and hasattr(socket, 'AF_INET6'):\n        return socket.AF_INET6\n    return socket.AF_INET\n\n\nclass BaseWSGIServer(HTTPServer, object):\n\n    \"\"\"Simple single-threaded, single-process WSGI server.\"\"\"\n    multithread = False\n    multiprocess = False\n    request_queue_size = LISTEN_QUEUE\n\n    def __init__(self, host, port, app, handler=None,\n                 passthrough_errors=False, ssl_context=None, fd=None):\n        if handler is None:\n            handler = WSGIRequestHandler\n\n        self.address_family = select_ip_version(host, port)\n\n        if fd is not None:\n            real_sock = socket.fromfd(fd, self.address_family,\n                                      socket.SOCK_STREAM)\n            port = 0\n        HTTPServer.__init__(self, (host, int(port)), handler)\n        self.app = app\n        self.passthrough_errors = passthrough_errors\n        self.shutdown_signal = False\n        self.host = host\n        self.port = port\n\n        # Patch in the original socket.\n        if fd is not None:\n            self.socket.close()\n            self.socket = real_sock\n            self.server_address = self.socket.getsockname()\n\n        if ssl_context is not None:\n            if isinstance(ssl_context, tuple):\n                ssl_context = load_ssl_context(*ssl_context)\n            if ssl_context == 'adhoc':\n                ssl_context = generate_adhoc_ssl_context()\n            self.socket = ssl_context.wrap_socket(self.socket,\n                                                  server_side=True)\n            self.ssl_context = ssl_context\n        else:\n            self.ssl_context = None\n\n    def log(self, type, message, *args):\n        _log(type, message, *args)\n\n    def serve_forever(self):\n        self.shutdown_signal = False\n        try:\n            if os.environ.get('WERKZEUG_RUN_MAIN') != 'true':\n                display_hostname = self.host != '*' and self.host or 'localhost'\n                if ':' in display_hostname:\n                    display_hostname = '[%s]' % display_hostname\n                quit_msg = '(Press CTRL+C to quit)'\n                _log('info', ' * Running on %s://%s:%d/ %s',\n                     self.ssl_context is None and 'http' or 'https',\n                     display_hostname, self.port, quit_msg)\n            HTTPServer.serve_forever(self)\n        except KeyboardInterrupt:\n            pass\n        finally:\n            self.server_close()\n\n    def handle_error(self, request, client_address):\n        if self.passthrough_errors:\n            raise\n        else:\n            return HTTPServer.handle_error(self, request, client_address)\n\n    def get_request(self):\n        con, info = self.socket.accept()\n        return con, info\n\n\nclass ThreadedWSGIServer(ThreadingMixIn, BaseWSGIServer):\n\n    \"\"\"A WSGI server that does threading.\"\"\"\n    multithread = True\n\n\nclass ForkingWSGIServer(ForkingMixIn, BaseWSGIServer):\n\n    \"\"\"A WSGI server that does forking.\"\"\"\n    multiprocess = True\n\n    def __init__(self, host, port, app, processes=40, handler=None,\n                 passthrough_errors=False, ssl_context=None):\n        BaseWSGIServer.__init__(self, host, port, app, handler,\n                                passthrough_errors, ssl_context)\n        self.max_children = processes\n\n\ndef make_server(host=None, port=None, app=None, threaded=False, processes=1,\n                request_handler=None, passthrough_errors=False,\n                ssl_context=None, fd=None):\n    \"\"\"Create a new server instance that is either threaded, or forks\n    or just processes one request after another.\n    \"\"\"\n    if threaded and processes > 1:\n        raise ValueError(\"cannot have a multithreaded and \"\n                         \"multi process server.\")\n    elif threaded:\n        return ThreadedWSGIServer(host, port, app, request_handler,\n                                  passthrough_errors, ssl_context, fd=fd)\n    elif processes > 1:\n        return ForkingWSGIServer(host, port, app, processes, request_handler,\n                                 passthrough_errors, ssl_context, fd=fd)\n    else:\n        return BaseWSGIServer(host, port, app, request_handler,\n                              passthrough_errors, ssl_context, fd=fd)\n\n\ndef is_running_from_reloader():\n    \"\"\"Checks if the application is running from within the Werkzeug\n    reloader subprocess.\n\n    .. versionadded:: 0.10\n    \"\"\"\n    return os.environ.get('WERKZEUG_RUN_MAIN') == 'true'\n\n\ndef run_simple(hostname, port, application, use_reloader=False,\n               use_debugger=False, use_evalex=True,\n               extra_files=None, reloader_interval=1,\n               reloader_type='auto', threaded=False,\n               processes=1, request_handler=None, static_files=None,\n               passthrough_errors=False, ssl_context=None):\n    \"\"\"Start a WSGI application. Optional features include a reloader,\n    multithreading and fork support.\n\n    This function has a command-line interface too::\n\n        python -m werkzeug.serving --help\n\n    .. versionadded:: 0.5\n       `static_files` was added to simplify serving of static files as well\n       as `passthrough_errors`.\n\n    .. versionadded:: 0.6\n       support for SSL was added.\n\n    .. versionadded:: 0.8\n       Added support for automatically loading a SSL context from certificate\n       file and private key.\n\n    .. versionadded:: 0.9\n       Added command-line interface.\n\n    .. versionadded:: 0.10\n       Improved the reloader and added support for changing the backend\n       through the `reloader_type` parameter.  See :ref:`reloader`\n       for more information.\n\n    :param hostname: The host for the application.  eg: ``'localhost'``\n    :param port: The port for the server.  eg: ``8080``\n    :param application: the WSGI application to execute\n    :param use_reloader: should the server automatically restart the python\n                         process if modules were changed?\n    :param use_debugger: should the werkzeug debugging system be used?\n    :param use_evalex: should the exception evaluation feature be enabled?\n    :param extra_files: a list of files the reloader should watch\n                        additionally to the modules.  For example configuration\n                        files.\n    :param reloader_interval: the interval for the reloader in seconds.\n    :param reloader_type: the type of reloader to use.  The default is\n                          auto detection.  Valid values are ``'stat'`` and\n                          ``'watchdog'``. See :ref:`reloader` for more\n                          information.\n    :param threaded: should the process handle each request in a separate\n                     thread?\n    :param processes: if greater than 1 then handle each request in a new process\n                      up to this maximum number of concurrent processes.\n    :param request_handler: optional parameter that can be used to replace\n                            the default one.  You can use this to replace it\n                            with a different\n                            :class:`~BaseHTTPServer.BaseHTTPRequestHandler`\n                            subclass.\n    :param static_files: a dict of paths for static files.  This works exactly\n                         like :class:`SharedDataMiddleware`, it's actually\n                         just wrapping the application in that middleware before\n                         serving.\n    :param passthrough_errors: set this to `True` to disable the error catching.\n                               This means that the server will die on errors but\n                               it can be useful to hook debuggers in (pdb etc.)\n    :param ssl_context: an SSL context for the connection. Either an\n                        :class:`ssl.SSLContext`, a tuple in the form\n                        ``(cert_file, pkey_file)``, the string ``'adhoc'`` if\n                        the server should automatically create one, or ``None``\n                        to disable SSL (which is the default).\n    \"\"\"\n    if use_debugger:\n        from werkzeug.debug import DebuggedApplication\n        application = DebuggedApplication(application, use_evalex)\n    if static_files:\n        from werkzeug.wsgi import SharedDataMiddleware\n        application = SharedDataMiddleware(application, static_files)\n\n    def inner():\n        try:\n            fd = int(os.environ['WERKZEUG_SERVER_FD'])\n        except (LookupError, ValueError):\n            fd = None\n        make_server(hostname, port, application, threaded,\n                    processes, request_handler,\n                    passthrough_errors, ssl_context,\n                    fd=fd).serve_forever()\n\n    if use_reloader:\n        # If we're not running already in the subprocess that is the\n        # reloader we want to open up a socket early to make sure the\n        # port is actually available.\n        if os.environ.get('WERKZEUG_RUN_MAIN') != 'true':\n            if port == 0 and not can_open_by_fd:\n                raise ValueError('Cannot bind to a random port with enabled '\n                                 'reloader if the Python interpreter does '\n                                 'not support socket opening by fd.')\n\n            # Create and destroy a socket so that any exceptions are\n            # raised before we spawn a separate Python interpreter and\n            # lose this ability.\n            address_family = select_ip_version(hostname, port)\n            s = socket.socket(address_family, socket.SOCK_STREAM)\n            s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)\n            s.bind((hostname, port))\n            if hasattr(os, 'set_inheritable'):\n                os.set_inheritable(s.fileno(), True)\n\n            # If we can open the socket by file descriptor, then we can just\n            # reuse this one and our socket will survive the restarts.\n            if can_open_by_fd:\n                os.environ['WERKZEUG_SERVER_FD'] = str(s.fileno())\n                s.listen(LISTEN_QUEUE)\n            else:\n                s.close()\n\n        from ._reloader import run_with_reloader\n        run_with_reloader(inner, extra_files, reloader_interval,\n                          reloader_type)\n    else:\n        inner()\n\n\ndef run_with_reloader(*args, **kwargs):\n    # People keep using undocumented APIs.  Do not use this function\n    # please, we do not guarantee that it continues working.\n    from ._reloader import run_with_reloader\n    return run_with_reloader(*args, **kwargs)\n\n\ndef main():\n    '''A simple command-line interface for :py:func:`run_simple`.'''\n\n    # in contrast to argparse, this works at least under Python < 2.7\n    import optparse\n    from werkzeug.utils import import_string\n\n    parser = optparse.OptionParser(\n        usage='Usage: %prog [options] app_module:app_object')\n    parser.add_option('-b', '--bind', dest='address',\n                      help='The hostname:port the app should listen on.')\n    parser.add_option('-d', '--debug', dest='use_debugger',\n                      action='store_true', default=False,\n                      help='Use Werkzeug\\'s debugger.')\n    parser.add_option('-r', '--reload', dest='use_reloader',\n                      action='store_true', default=False,\n                      help='Reload Python process if modules change.')\n    options, args = parser.parse_args()\n\n    hostname, port = None, None\n    if options.address:\n        address = options.address.split(':')\n        hostname = address[0]\n        if len(address) > 1:\n            port = address[1]\n\n    if len(args) != 1:\n        sys.stdout.write('No application supplied, or too much. See --help\\n')\n        sys.exit(1)\n    app = import_string(args[0])\n\n    run_simple(\n        hostname=(hostname or '127.0.0.1'), port=int(port or 5000),\n        application=app, use_reloader=options.use_reloader,\n        use_debugger=options.use_debugger\n    )\n\nif __name__ == '__main__':\n    main()\n"
  },
  {
    "path": "lib/werkzeug/test.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    werkzeug.test\n    ~~~~~~~~~~~~~\n\n    This module implements a client to WSGI applications for testing.\n\n    :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nimport sys\nimport mimetypes\nfrom time import time\nfrom random import random\nfrom itertools import chain\nfrom tempfile import TemporaryFile\nfrom io import BytesIO\n\ntry:\n    from urllib2 import Request as U2Request\nexcept ImportError:\n    from urllib.request import Request as U2Request\ntry:\n    from http.cookiejar import CookieJar\nexcept ImportError:  # Py2\n    from cookielib import CookieJar\n\nfrom werkzeug._compat import iterlists, iteritems, itervalues, to_bytes, \\\n    string_types, text_type, reraise, wsgi_encoding_dance, \\\n    make_literal_wrapper\nfrom werkzeug._internal import _empty_stream, _get_environ\nfrom werkzeug.wrappers import BaseRequest\nfrom werkzeug.urls import url_encode, url_fix, iri_to_uri, url_unquote, \\\n    url_unparse, url_parse\nfrom werkzeug.wsgi import get_host, get_current_url, ClosingIterator\nfrom werkzeug.utils import dump_cookie\nfrom werkzeug.datastructures import FileMultiDict, MultiDict, \\\n    CombinedMultiDict, Headers, FileStorage\n\n\ndef stream_encode_multipart(values, use_tempfile=True, threshold=1024 * 500,\n                            boundary=None, charset='utf-8'):\n    \"\"\"Encode a dict of values (either strings or file descriptors or\n    :class:`FileStorage` objects.) into a multipart encoded string stored\n    in a file descriptor.\n    \"\"\"\n    if boundary is None:\n        boundary = '---------------WerkzeugFormPart_%s%s' % (time(), random())\n    _closure = [BytesIO(), 0, False]\n\n    if use_tempfile:\n        def write_binary(string):\n            stream, total_length, on_disk = _closure\n            if on_disk:\n                stream.write(string)\n            else:\n                length = len(string)\n                if length + _closure[1] <= threshold:\n                    stream.write(string)\n                else:\n                    new_stream = TemporaryFile('wb+')\n                    new_stream.write(stream.getvalue())\n                    new_stream.write(string)\n                    _closure[0] = new_stream\n                    _closure[2] = True\n                _closure[1] = total_length + length\n    else:\n        write_binary = _closure[0].write\n\n    def write(string):\n        write_binary(string.encode(charset))\n\n    if not isinstance(values, MultiDict):\n        values = MultiDict(values)\n\n    for key, values in iterlists(values):\n        for value in values:\n            write('--%s\\r\\nContent-Disposition: form-data; name=\"%s\"' %\n                  (boundary, key))\n            reader = getattr(value, 'read', None)\n            if reader is not None:\n                filename = getattr(value, 'filename',\n                                   getattr(value, 'name', None))\n                content_type = getattr(value, 'content_type', None)\n                if content_type is None:\n                    content_type = filename and \\\n                        mimetypes.guess_type(filename)[0] or \\\n                        'application/octet-stream'\n                if filename is not None:\n                    write('; filename=\"%s\"\\r\\n' % filename)\n                else:\n                    write('\\r\\n')\n                write('Content-Type: %s\\r\\n\\r\\n' % content_type)\n                while 1:\n                    chunk = reader(16384)\n                    if not chunk:\n                        break\n                    write_binary(chunk)\n            else:\n                if not isinstance(value, string_types):\n                    value = str(value)\n                else:\n                    value = to_bytes(value, charset)\n                write('\\r\\n\\r\\n')\n                write_binary(value)\n            write('\\r\\n')\n    write('--%s--\\r\\n' % boundary)\n\n    length = int(_closure[0].tell())\n    _closure[0].seek(0)\n    return _closure[0], length, boundary\n\n\ndef encode_multipart(values, boundary=None, charset='utf-8'):\n    \"\"\"Like `stream_encode_multipart` but returns a tuple in the form\n    (``boundary``, ``data``) where data is a bytestring.\n    \"\"\"\n    stream, length, boundary = stream_encode_multipart(\n        values, use_tempfile=False, boundary=boundary, charset=charset)\n    return boundary, stream.read()\n\n\ndef File(fd, filename=None, mimetype=None):\n    \"\"\"Backwards compat.\"\"\"\n    from warnings import warn\n    warn(DeprecationWarning('werkzeug.test.File is deprecated, use the '\n                            'EnvironBuilder or FileStorage instead'))\n    return FileStorage(fd, filename=filename, content_type=mimetype)\n\n\nclass _TestCookieHeaders(object):\n\n    \"\"\"A headers adapter for cookielib\n    \"\"\"\n\n    def __init__(self, headers):\n        self.headers = headers\n\n    def getheaders(self, name):\n        headers = []\n        name = name.lower()\n        for k, v in self.headers:\n            if k.lower() == name:\n                headers.append(v)\n        return headers\n\n    def get_all(self, name, default=None):\n        rv = []\n        for k, v in self.headers:\n            if k.lower() == name.lower():\n                rv.append(v)\n        return rv or default or []\n\n\nclass _TestCookieResponse(object):\n\n    \"\"\"Something that looks like a httplib.HTTPResponse, but is actually just an\n    adapter for our test responses to make them available for cookielib.\n    \"\"\"\n\n    def __init__(self, headers):\n        self.headers = _TestCookieHeaders(headers)\n\n    def info(self):\n        return self.headers\n\n\nclass _TestCookieJar(CookieJar):\n\n    \"\"\"A cookielib.CookieJar modified to inject and read cookie headers from\n    and to wsgi environments, and wsgi application responses.\n    \"\"\"\n\n    def inject_wsgi(self, environ):\n        \"\"\"Inject the cookies as client headers into the server's wsgi\n        environment.\n        \"\"\"\n        cvals = []\n        for cookie in self:\n            cvals.append('%s=%s' % (cookie.name, cookie.value))\n        if cvals:\n            environ['HTTP_COOKIE'] = '; '.join(cvals)\n\n    def extract_wsgi(self, environ, headers):\n        \"\"\"Extract the server's set-cookie headers as cookies into the\n        cookie jar.\n        \"\"\"\n        self.extract_cookies(\n            _TestCookieResponse(headers),\n            U2Request(get_current_url(environ)),\n        )\n\n\ndef _iter_data(data):\n    \"\"\"Iterates over a dict or multidict yielding all keys and values.\n    This is used to iterate over the data passed to the\n    :class:`EnvironBuilder`.\n    \"\"\"\n    if isinstance(data, MultiDict):\n        for key, values in iterlists(data):\n            for value in values:\n                yield key, value\n    else:\n        for key, values in iteritems(data):\n            if isinstance(values, list):\n                for value in values:\n                    yield key, value\n            else:\n                yield key, values\n\n\nclass EnvironBuilder(object):\n\n    \"\"\"This class can be used to conveniently create a WSGI environment\n    for testing purposes.  It can be used to quickly create WSGI environments\n    or request objects from arbitrary data.\n\n    The signature of this class is also used in some other places as of\n    Werkzeug 0.5 (:func:`create_environ`, :meth:`BaseResponse.from_values`,\n    :meth:`Client.open`).  Because of this most of the functionality is\n    available through the constructor alone.\n\n    Files and regular form data can be manipulated independently of each\n    other with the :attr:`form` and :attr:`files` attributes, but are\n    passed with the same argument to the constructor: `data`.\n\n    `data` can be any of these values:\n\n    -   a `str`: If it's a string it is converted into a :attr:`input_stream`,\n        the :attr:`content_length` is set and you have to provide a\n        :attr:`content_type`.\n    -   a `dict`: If it's a dict the keys have to be strings and the values\n        any of the following objects:\n\n        -   a :class:`file`-like object.  These are converted into\n            :class:`FileStorage` objects automatically.\n        -   a tuple.  The :meth:`~FileMultiDict.add_file` method is called\n            with the tuple items as positional arguments.\n\n    .. versionadded:: 0.6\n       `path` and `base_url` can now be unicode strings that are encoded using\n       the :func:`iri_to_uri` function.\n\n    :param path: the path of the request.  In the WSGI environment this will\n                 end up as `PATH_INFO`.  If the `query_string` is not defined\n                 and there is a question mark in the `path` everything after\n                 it is used as query string.\n    :param base_url: the base URL is a URL that is used to extract the WSGI\n                     URL scheme, host (server name + server port) and the\n                     script root (`SCRIPT_NAME`).\n    :param query_string: an optional string or dict with URL parameters.\n    :param method: the HTTP method to use, defaults to `GET`.\n    :param input_stream: an optional input stream.  Do not specify this and\n                         `data`.  As soon as an input stream is set you can't\n                         modify :attr:`args` and :attr:`files` unless you\n                         set the :attr:`input_stream` to `None` again.\n    :param content_type: The content type for the request.  As of 0.5 you\n                         don't have to provide this when specifying files\n                         and form data via `data`.\n    :param content_length: The content length for the request.  You don't\n                           have to specify this when providing data via\n                           `data`.\n    :param errors_stream: an optional error stream that is used for\n                          `wsgi.errors`.  Defaults to :data:`stderr`.\n    :param multithread: controls `wsgi.multithread`.  Defaults to `False`.\n    :param multiprocess: controls `wsgi.multiprocess`.  Defaults to `False`.\n    :param run_once: controls `wsgi.run_once`.  Defaults to `False`.\n    :param headers: an optional list or :class:`Headers` object of headers.\n    :param data: a string or dict of form data.  See explanation above.\n    :param environ_base: an optional dict of environment defaults.\n    :param environ_overrides: an optional dict of environment overrides.\n    :param charset: the charset used to encode unicode data.\n    \"\"\"\n\n    #: the server protocol to use.  defaults to HTTP/1.1\n    server_protocol = 'HTTP/1.1'\n\n    #: the wsgi version to use.  defaults to (1, 0)\n    wsgi_version = (1, 0)\n\n    #: the default request class for :meth:`get_request`\n    request_class = BaseRequest\n\n    def __init__(self, path='/', base_url=None, query_string=None,\n                 method='GET', input_stream=None, content_type=None,\n                 content_length=None, errors_stream=None, multithread=False,\n                 multiprocess=False, run_once=False, headers=None, data=None,\n                 environ_base=None, environ_overrides=None, charset='utf-8'):\n        path_s = make_literal_wrapper(path)\n        if query_string is None and path_s('?') in path:\n            path, query_string = path.split(path_s('?'), 1)\n        self.charset = charset\n        self.path = iri_to_uri(path)\n        if base_url is not None:\n            base_url = url_fix(iri_to_uri(base_url, charset), charset)\n        self.base_url = base_url\n        if isinstance(query_string, (bytes, text_type)):\n            self.query_string = query_string\n        else:\n            if query_string is None:\n                query_string = MultiDict()\n            elif not isinstance(query_string, MultiDict):\n                query_string = MultiDict(query_string)\n            self.args = query_string\n        self.method = method\n        if headers is None:\n            headers = Headers()\n        elif not isinstance(headers, Headers):\n            headers = Headers(headers)\n        self.headers = headers\n        if content_type is not None:\n            self.content_type = content_type\n        if errors_stream is None:\n            errors_stream = sys.stderr\n        self.errors_stream = errors_stream\n        self.multithread = multithread\n        self.multiprocess = multiprocess\n        self.run_once = run_once\n        self.environ_base = environ_base\n        self.environ_overrides = environ_overrides\n        self.input_stream = input_stream\n        self.content_length = content_length\n        self.closed = False\n\n        if data:\n            if input_stream is not None:\n                raise TypeError('can\\'t provide input stream and data')\n            if isinstance(data, text_type):\n                data = data.encode(self.charset)\n            if isinstance(data, bytes):\n                self.input_stream = BytesIO(data)\n                if self.content_length is None:\n                    self.content_length = len(data)\n            else:\n                for key, value in _iter_data(data):\n                    if isinstance(value, (tuple, dict)) or \\\n                       hasattr(value, 'read'):\n                        self._add_file_from_data(key, value)\n                    else:\n                        self.form.setlistdefault(key).append(value)\n\n    def _add_file_from_data(self, key, value):\n        \"\"\"Called in the EnvironBuilder to add files from the data dict.\"\"\"\n        if isinstance(value, tuple):\n            self.files.add_file(key, *value)\n        elif isinstance(value, dict):\n            from warnings import warn\n            warn(DeprecationWarning('it\\'s no longer possible to pass dicts '\n                                    'as `data`.  Use tuples or FileStorage '\n                                    'objects instead'), stacklevel=2)\n            value = dict(value)\n            mimetype = value.pop('mimetype', None)\n            if mimetype is not None:\n                value['content_type'] = mimetype\n            self.files.add_file(key, **value)\n        else:\n            self.files.add_file(key, value)\n\n    def _get_base_url(self):\n        return url_unparse((self.url_scheme, self.host,\n                            self.script_root, '', '')).rstrip('/') + '/'\n\n    def _set_base_url(self, value):\n        if value is None:\n            scheme = 'http'\n            netloc = 'localhost'\n            script_root = ''\n        else:\n            scheme, netloc, script_root, qs, anchor = url_parse(value)\n            if qs or anchor:\n                raise ValueError('base url must not contain a query string '\n                                 'or fragment')\n        self.script_root = script_root.rstrip('/')\n        self.host = netloc\n        self.url_scheme = scheme\n\n    base_url = property(_get_base_url, _set_base_url, doc='''\n        The base URL is a URL that is used to extract the WSGI\n        URL scheme, host (server name + server port) and the\n        script root (`SCRIPT_NAME`).''')\n    del _get_base_url, _set_base_url\n\n    def _get_content_type(self):\n        ct = self.headers.get('Content-Type')\n        if ct is None and not self._input_stream:\n            if self._files:\n                return 'multipart/form-data'\n            elif self._form:\n                return 'application/x-www-form-urlencoded'\n            return None\n        return ct\n\n    def _set_content_type(self, value):\n        if value is None:\n            self.headers.pop('Content-Type', None)\n        else:\n            self.headers['Content-Type'] = value\n\n    content_type = property(_get_content_type, _set_content_type, doc='''\n        The content type for the request.  Reflected from and to the\n        :attr:`headers`.  Do not set if you set :attr:`files` or\n        :attr:`form` for auto detection.''')\n    del _get_content_type, _set_content_type\n\n    def _get_content_length(self):\n        return self.headers.get('Content-Length', type=int)\n\n    def _set_content_length(self, value):\n        if value is None:\n            self.headers.pop('Content-Length', None)\n        else:\n            self.headers['Content-Length'] = str(value)\n\n    content_length = property(_get_content_length, _set_content_length, doc='''\n        The content length as integer.  Reflected from and to the\n        :attr:`headers`.  Do not set if you set :attr:`files` or\n        :attr:`form` for auto detection.''')\n    del _get_content_length, _set_content_length\n\n    def form_property(name, storage, doc):\n        key = '_' + name\n\n        def getter(self):\n            if self._input_stream is not None:\n                raise AttributeError('an input stream is defined')\n            rv = getattr(self, key)\n            if rv is None:\n                rv = storage()\n                setattr(self, key, rv)\n\n            return rv\n\n        def setter(self, value):\n            self._input_stream = None\n            setattr(self, key, value)\n        return property(getter, setter, doc)\n\n    form = form_property('form', MultiDict, doc='''\n        A :class:`MultiDict` of form values.''')\n    files = form_property('files', FileMultiDict, doc='''\n        A :class:`FileMultiDict` of uploaded files.  You can use the\n        :meth:`~FileMultiDict.add_file` method to add new files to the\n        dict.''')\n    del form_property\n\n    def _get_input_stream(self):\n        return self._input_stream\n\n    def _set_input_stream(self, value):\n        self._input_stream = value\n        self._form = self._files = None\n\n    input_stream = property(_get_input_stream, _set_input_stream, doc='''\n        An optional input stream.  If you set this it will clear\n        :attr:`form` and :attr:`files`.''')\n    del _get_input_stream, _set_input_stream\n\n    def _get_query_string(self):\n        if self._query_string is None:\n            if self._args is not None:\n                return url_encode(self._args, charset=self.charset)\n            return ''\n        return self._query_string\n\n    def _set_query_string(self, value):\n        self._query_string = value\n        self._args = None\n\n    query_string = property(_get_query_string, _set_query_string, doc='''\n        The query string.  If you set this to a string :attr:`args` will\n        no longer be available.''')\n    del _get_query_string, _set_query_string\n\n    def _get_args(self):\n        if self._query_string is not None:\n            raise AttributeError('a query string is defined')\n        if self._args is None:\n            self._args = MultiDict()\n        return self._args\n\n    def _set_args(self, value):\n        self._query_string = None\n        self._args = value\n\n    args = property(_get_args, _set_args, doc='''\n        The URL arguments as :class:`MultiDict`.''')\n    del _get_args, _set_args\n\n    @property\n    def server_name(self):\n        \"\"\"The server name (read-only, use :attr:`host` to set)\"\"\"\n        return self.host.split(':', 1)[0]\n\n    @property\n    def server_port(self):\n        \"\"\"The server port as integer (read-only, use :attr:`host` to set)\"\"\"\n        pieces = self.host.split(':', 1)\n        if len(pieces) == 2 and pieces[1].isdigit():\n            return int(pieces[1])\n        elif self.url_scheme == 'https':\n            return 443\n        return 80\n\n    def __del__(self):\n        try:\n            self.close()\n        except Exception:\n            pass\n\n    def close(self):\n        \"\"\"Closes all files.  If you put real :class:`file` objects into the\n        :attr:`files` dict you can call this method to automatically close\n        them all in one go.\n        \"\"\"\n        if self.closed:\n            return\n        try:\n            files = itervalues(self.files)\n        except AttributeError:\n            files = ()\n        for f in files:\n            try:\n                f.close()\n            except Exception:\n                pass\n        self.closed = True\n\n    def get_environ(self):\n        \"\"\"Return the built environ.\"\"\"\n        input_stream = self.input_stream\n        content_length = self.content_length\n        content_type = self.content_type\n\n        if input_stream is not None:\n            start_pos = input_stream.tell()\n            input_stream.seek(0, 2)\n            end_pos = input_stream.tell()\n            input_stream.seek(start_pos)\n            content_length = end_pos - start_pos\n        elif content_type == 'multipart/form-data':\n            values = CombinedMultiDict([self.form, self.files])\n            input_stream, content_length, boundary = \\\n                stream_encode_multipart(values, charset=self.charset)\n            content_type += '; boundary=\"%s\"' % boundary\n        elif content_type == 'application/x-www-form-urlencoded':\n            # XXX: py2v3 review\n            values = url_encode(self.form, charset=self.charset)\n            values = values.encode('ascii')\n            content_length = len(values)\n            input_stream = BytesIO(values)\n        else:\n            input_stream = _empty_stream\n\n        result = {}\n        if self.environ_base:\n            result.update(self.environ_base)\n\n        def _path_encode(x):\n            return wsgi_encoding_dance(url_unquote(x, self.charset), self.charset)\n\n        qs = wsgi_encoding_dance(self.query_string)\n\n        result.update({\n            'REQUEST_METHOD':       self.method,\n            'SCRIPT_NAME':          _path_encode(self.script_root),\n            'PATH_INFO':            _path_encode(self.path),\n            'QUERY_STRING':         qs,\n            'SERVER_NAME':          self.server_name,\n            'SERVER_PORT':          str(self.server_port),\n            'HTTP_HOST':            self.host,\n            'SERVER_PROTOCOL':      self.server_protocol,\n            'CONTENT_TYPE':         content_type or '',\n            'CONTENT_LENGTH':       str(content_length or '0'),\n            'wsgi.version':         self.wsgi_version,\n            'wsgi.url_scheme':      self.url_scheme,\n            'wsgi.input':           input_stream,\n            'wsgi.errors':          self.errors_stream,\n            'wsgi.multithread':     self.multithread,\n            'wsgi.multiprocess':    self.multiprocess,\n            'wsgi.run_once':        self.run_once\n        })\n        for key, value in self.headers.to_wsgi_list():\n            result['HTTP_%s' % key.upper().replace('-', '_')] = value\n        if self.environ_overrides:\n            result.update(self.environ_overrides)\n        return result\n\n    def get_request(self, cls=None):\n        \"\"\"Returns a request with the data.  If the request class is not\n        specified :attr:`request_class` is used.\n\n        :param cls: The request wrapper to use.\n        \"\"\"\n        if cls is None:\n            cls = self.request_class\n        return cls(self.get_environ())\n\n\nclass ClientRedirectError(Exception):\n\n    \"\"\"\n    If a redirect loop is detected when using follow_redirects=True with\n    the :cls:`Client`, then this exception is raised.\n    \"\"\"\n\n\nclass Client(object):\n\n    \"\"\"This class allows to send requests to a wrapped application.\n\n    The response wrapper can be a class or factory function that takes\n    three arguments: app_iter, status and headers.  The default response\n    wrapper just returns a tuple.\n\n    Example::\n\n        class ClientResponse(BaseResponse):\n            ...\n\n        client = Client(MyApplication(), response_wrapper=ClientResponse)\n\n    The use_cookies parameter indicates whether cookies should be stored and\n    sent for subsequent requests. This is True by default, but passing False\n    will disable this behaviour.\n\n    If you want to request some subdomain of your application you may set\n    `allow_subdomain_redirects` to `True` as if not no external redirects\n    are allowed.\n\n    .. versionadded:: 0.5\n       `use_cookies` is new in this version.  Older versions did not provide\n       builtin cookie support.\n    \"\"\"\n\n    def __init__(self, application, response_wrapper=None, use_cookies=True,\n                 allow_subdomain_redirects=False):\n        self.application = application\n        self.response_wrapper = response_wrapper\n        if use_cookies:\n            self.cookie_jar = _TestCookieJar()\n        else:\n            self.cookie_jar = None\n        self.allow_subdomain_redirects = allow_subdomain_redirects\n\n    def set_cookie(self, server_name, key, value='', max_age=None,\n                   expires=None, path='/', domain=None, secure=None,\n                   httponly=False, charset='utf-8'):\n        \"\"\"Sets a cookie in the client's cookie jar.  The server name\n        is required and has to match the one that is also passed to\n        the open call.\n        \"\"\"\n        assert self.cookie_jar is not None, 'cookies disabled'\n        header = dump_cookie(key, value, max_age, expires, path, domain,\n                             secure, httponly, charset)\n        environ = create_environ(path, base_url='http://' + server_name)\n        headers = [('Set-Cookie', header)]\n        self.cookie_jar.extract_wsgi(environ, headers)\n\n    def delete_cookie(self, server_name, key, path='/', domain=None):\n        \"\"\"Deletes a cookie in the test client.\"\"\"\n        self.set_cookie(server_name, key, expires=0, max_age=0,\n                        path=path, domain=domain)\n\n    def run_wsgi_app(self, environ, buffered=False):\n        \"\"\"Runs the wrapped WSGI app with the given environment.\"\"\"\n        if self.cookie_jar is not None:\n            self.cookie_jar.inject_wsgi(environ)\n        rv = run_wsgi_app(self.application, environ, buffered=buffered)\n        if self.cookie_jar is not None:\n            self.cookie_jar.extract_wsgi(environ, rv[2])\n        return rv\n\n    def resolve_redirect(self, response, new_location, environ, buffered=False):\n        \"\"\"Resolves a single redirect and triggers the request again\n        directly on this redirect client.\n        \"\"\"\n        scheme, netloc, script_root, qs, anchor = url_parse(new_location)\n        base_url = url_unparse((scheme, netloc, '', '', '')).rstrip('/') + '/'\n\n        cur_server_name = netloc.split(':', 1)[0].split('.')\n        real_server_name = get_host(environ).rsplit(':', 1)[0].split('.')\n\n        if self.allow_subdomain_redirects:\n            allowed = cur_server_name[-len(real_server_name):] == real_server_name\n        else:\n            allowed = cur_server_name == real_server_name\n\n        if not allowed:\n            raise RuntimeError('%r does not support redirect to '\n                               'external targets' % self.__class__)\n\n        status_code = int(response[1].split(None, 1)[0])\n        if status_code == 307:\n            method = environ['REQUEST_METHOD']\n        else:\n            method = 'GET'\n\n        # For redirect handling we temporarily disable the response\n        # wrapper.  This is not threadsafe but not a real concern\n        # since the test client must not be shared anyways.\n        old_response_wrapper = self.response_wrapper\n        self.response_wrapper = None\n        try:\n            return self.open(path=script_root, base_url=base_url,\n                             query_string=qs, as_tuple=True,\n                             buffered=buffered, method=method)\n        finally:\n            self.response_wrapper = old_response_wrapper\n\n    def open(self, *args, **kwargs):\n        \"\"\"Takes the same arguments as the :class:`EnvironBuilder` class with\n        some additions:  You can provide a :class:`EnvironBuilder` or a WSGI\n        environment as only argument instead of the :class:`EnvironBuilder`\n        arguments and two optional keyword arguments (`as_tuple`, `buffered`)\n        that change the type of the return value or the way the application is\n        executed.\n\n        .. versionchanged:: 0.5\n           If a dict is provided as file in the dict for the `data` parameter\n           the content type has to be called `content_type` now instead of\n           `mimetype`.  This change was made for consistency with\n           :class:`werkzeug.FileWrapper`.\n\n            The `follow_redirects` parameter was added to :func:`open`.\n\n        Additional parameters:\n\n        :param as_tuple: Returns a tuple in the form ``(environ, result)``\n        :param buffered: Set this to True to buffer the application run.\n                         This will automatically close the application for\n                         you as well.\n        :param follow_redirects: Set this to True if the `Client` should\n                                 follow HTTP redirects.\n        \"\"\"\n        as_tuple = kwargs.pop('as_tuple', False)\n        buffered = kwargs.pop('buffered', False)\n        follow_redirects = kwargs.pop('follow_redirects', False)\n        environ = None\n        if not kwargs and len(args) == 1:\n            if isinstance(args[0], EnvironBuilder):\n                environ = args[0].get_environ()\n            elif isinstance(args[0], dict):\n                environ = args[0]\n        if environ is None:\n            builder = EnvironBuilder(*args, **kwargs)\n            try:\n                environ = builder.get_environ()\n            finally:\n                builder.close()\n\n        response = self.run_wsgi_app(environ, buffered=buffered)\n\n        # handle redirects\n        redirect_chain = []\n        while 1:\n            status_code = int(response[1].split(None, 1)[0])\n            if status_code not in (301, 302, 303, 305, 307) \\\n               or not follow_redirects:\n                break\n            new_location = response[2]['location']\n            new_redirect_entry = (new_location, status_code)\n            if new_redirect_entry in redirect_chain:\n                raise ClientRedirectError('loop detected')\n            redirect_chain.append(new_redirect_entry)\n            environ, response = self.resolve_redirect(response, new_location,\n                                                      environ,\n                                                      buffered=buffered)\n\n        if self.response_wrapper is not None:\n            response = self.response_wrapper(*response)\n        if as_tuple:\n            return environ, response\n        return response\n\n    def get(self, *args, **kw):\n        \"\"\"Like open but method is enforced to GET.\"\"\"\n        kw['method'] = 'GET'\n        return self.open(*args, **kw)\n\n    def patch(self, *args, **kw):\n        \"\"\"Like open but method is enforced to PATCH.\"\"\"\n        kw['method'] = 'PATCH'\n        return self.open(*args, **kw)\n\n    def post(self, *args, **kw):\n        \"\"\"Like open but method is enforced to POST.\"\"\"\n        kw['method'] = 'POST'\n        return self.open(*args, **kw)\n\n    def head(self, *args, **kw):\n        \"\"\"Like open but method is enforced to HEAD.\"\"\"\n        kw['method'] = 'HEAD'\n        return self.open(*args, **kw)\n\n    def put(self, *args, **kw):\n        \"\"\"Like open but method is enforced to PUT.\"\"\"\n        kw['method'] = 'PUT'\n        return self.open(*args, **kw)\n\n    def delete(self, *args, **kw):\n        \"\"\"Like open but method is enforced to DELETE.\"\"\"\n        kw['method'] = 'DELETE'\n        return self.open(*args, **kw)\n\n    def options(self, *args, **kw):\n        \"\"\"Like open but method is enforced to OPTIONS.\"\"\"\n        kw['method'] = 'OPTIONS'\n        return self.open(*args, **kw)\n\n    def trace(self, *args, **kw):\n        \"\"\"Like open but method is enforced to TRACE.\"\"\"\n        kw['method'] = 'TRACE'\n        return self.open(*args, **kw)\n\n    def __repr__(self):\n        return '<%s %r>' % (\n            self.__class__.__name__,\n            self.application\n        )\n\n\ndef create_environ(*args, **kwargs):\n    \"\"\"Create a new WSGI environ dict based on the values passed.  The first\n    parameter should be the path of the request which defaults to '/'.  The\n    second one can either be an absolute path (in that case the host is\n    localhost:80) or a full path to the request with scheme, netloc port and\n    the path to the script.\n\n    This accepts the same arguments as the :class:`EnvironBuilder`\n    constructor.\n\n    .. versionchanged:: 0.5\n       This function is now a thin wrapper over :class:`EnvironBuilder` which\n       was added in 0.5.  The `headers`, `environ_base`, `environ_overrides`\n       and `charset` parameters were added.\n    \"\"\"\n    builder = EnvironBuilder(*args, **kwargs)\n    try:\n        return builder.get_environ()\n    finally:\n        builder.close()\n\n\ndef run_wsgi_app(app, environ, buffered=False):\n    \"\"\"Return a tuple in the form (app_iter, status, headers) of the\n    application output.  This works best if you pass it an application that\n    returns an iterator all the time.\n\n    Sometimes applications may use the `write()` callable returned\n    by the `start_response` function.  This tries to resolve such edge\n    cases automatically.  But if you don't get the expected output you\n    should set `buffered` to `True` which enforces buffering.\n\n    If passed an invalid WSGI application the behavior of this function is\n    undefined.  Never pass non-conforming WSGI applications to this function.\n\n    :param app: the application to execute.\n    :param buffered: set to `True` to enforce buffering.\n    :return: tuple in the form ``(app_iter, status, headers)``\n    \"\"\"\n    environ = _get_environ(environ)\n    response = []\n    buffer = []\n\n    def start_response(status, headers, exc_info=None):\n        if exc_info is not None:\n            reraise(*exc_info)\n        response[:] = [status, headers]\n        return buffer.append\n\n    app_rv = app(environ, start_response)\n    close_func = getattr(app_rv, 'close', None)\n    app_iter = iter(app_rv)\n\n    # when buffering we emit the close call early and convert the\n    # application iterator into a regular list\n    if buffered:\n        try:\n            app_iter = list(app_iter)\n        finally:\n            if close_func is not None:\n                close_func()\n\n    # otherwise we iterate the application iter until we have a response, chain\n    # the already received data with the already collected data and wrap it in\n    # a new `ClosingIterator` if we need to restore a `close` callable from the\n    # original return value.\n    else:\n        while not response:\n            buffer.append(next(app_iter))\n        if buffer:\n            app_iter = chain(buffer, app_iter)\n        if close_func is not None and app_iter is not app_rv:\n            app_iter = ClosingIterator(app_iter, close_func)\n\n    return app_iter, response[0], Headers(response[1])\n"
  },
  {
    "path": "lib/werkzeug/testapp.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    werkzeug.testapp\n    ~~~~~~~~~~~~~~~~\n\n    Provide a small test application that can be used to test a WSGI server\n    and check it for WSGI compliance.\n\n    :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nimport os\nimport sys\nimport werkzeug\nfrom textwrap import wrap\nfrom werkzeug.wrappers import BaseRequest as Request, BaseResponse as Response\nfrom werkzeug.utils import escape\nimport base64\n\nlogo = Response(base64.b64decode('''\nR0lGODlhoACgAOMIAAEDACwpAEpCAGdgAJaKAM28AOnVAP3rAP/////////\n//////////////////////yH5BAEKAAgALAAAAACgAKAAAAT+EMlJq704680R+F0ojmRpnuj0rWnrv\nnB8rbRs33gu0bzu/0AObxgsGn3D5HHJbCUFyqZ0ukkSDlAidctNFg7gbI9LZlrBaHGtzAae0eloe25\n7w9EDOX2fst/xenyCIn5/gFqDiVVDV4aGeYiKkhSFjnCQY5OTlZaXgZp8nJ2ekaB0SQOjqphrpnOiq\nncEn65UsLGytLVmQ6m4sQazpbtLqL/HwpnER8bHyLrLOc3Oz8PRONPU1crXN9na263dMt/g4SzjMeX\nm5yDpLqgG7OzJ4u8lT/P69ej3JPn69kHzN2OIAHkB9RUYSFCFQYQJFTIkCDBiwoXWGnowaLEjRm7+G\np9A7Hhx4rUkAUaSLJlxHMqVMD/aSycSZkyTplCqtGnRAM5NQ1Ly5OmzZc6gO4d6DGAUKA+hSocWYAo\nSlM6oUWX2O/o0KdaVU5vuSQLAa0ADwQgMEMB2AIECZhVSnTno6spgbtXmHcBUrQACcc2FrTrWS8wAf\n78cMFBgwIBgbN+qvTt3ayikRBk7BoyGAGABAdYyfdzRQGV3l4coxrqQ84GpUBmrdR3xNIDUPAKDBSA\nADIGDhhqTZIWaDcrVX8EsbNzbkvCOxG8bN5w8ly9H8jyTJHC6DFndQydbguh2e/ctZJFXRxMAqqPVA\ntQH5E64SPr1f0zz7sQYjAHg0In+JQ11+N2B0XXBeeYZgBZFx4tqBToiTCPv0YBgQv8JqA6BEf6RhXx\nw1ENhRBnWV8ctEX4Ul2zc3aVGcQNC2KElyTDYyYUWvShdjDyMOGMuFjqnII45aogPhz/CodUHFwaDx\nlTgsaOjNyhGWJQd+lFoAGk8ObghI0kawg+EV5blH3dr+digkYuAGSaQZFHFz2P/cTaLmhF52QeSb45\nJwxd+uSVGHlqOZpOeJpCFZ5J+rkAkFjQ0N1tah7JJSZUFNsrkeJUJMIBi8jyaEKIhKPomnC91Uo+NB\nyyaJ5umnnpInIFh4t6ZSpGaAVmizqjpByDegYl8tPE0phCYrhcMWSv+uAqHfgH88ak5UXZmlKLVJhd\ndj78s1Fxnzo6yUCrV6rrDOkluG+QzCAUTbCwf9SrmMLzK6p+OPHx7DF+bsfMRq7Ec61Av9i6GLw23r\nidnZ+/OO0a99pbIrJkproCQMA17OPG6suq3cca5ruDfXCCDoS7BEdvmJn5otdqscn+uogRHHXs8cbh\nEIfYaDY1AkrC0cqwcZpnM6ludx72x0p7Fo/hZAcpJDjax0UdHavMKAbiKltMWCF3xxh9k25N/Viud8\nba78iCvUkt+V6BpwMlErmcgc502x+u1nSxJSJP9Mi52awD1V4yB/QHONsnU3L+A/zR4VL/indx/y64\ngqcj+qgTeweM86f0Qy1QVbvmWH1D9h+alqg254QD8HJXHvjQaGOqEqC22M54PcftZVKVSQG9jhkv7C\nJyTyDoAJfPdu8v7DRZAxsP/ky9MJ3OL36DJfCFPASC3/aXlfLOOON9vGZZHydGf8LnxYJuuVIbl83y\nAz5n/RPz07E+9+zw2A2ahz4HxHo9Kt79HTMx1Q7ma7zAzHgHqYH0SoZWyTuOLMiHwSfZDAQTn0ajk9\nYQqodnUYjByQZhZak9Wu4gYQsMyEpIOAOQKze8CmEF45KuAHTvIDOfHJNipwoHMuGHBnJElUoDmAyX\nc2Qm/R8Ah/iILCCJOEokGowdhDYc/yoL+vpRGwyVSCWFYZNljkhEirGXsalWcAgOdeAdoXcktF2udb\nqbUhjWyMQxYO01o6KYKOr6iK3fE4MaS+DsvBsGOBaMb0Y6IxADaJhFICaOLmiWTlDAnY1KzDG4ambL\ncWBA8mUzjJsN2KjSaSXGqMCVXYpYkj33mcIApyhQf6YqgeNAmNvuC0t4CsDbSshZJkCS1eNisKqlyG\ncF8G2JeiDX6tO6Mv0SmjCa3MFb0bJaGPMU0X7c8XcpvMaOQmCajwSeY9G0WqbBmKv34DsMIEztU6Y2\nKiDlFdt6jnCSqx7Dmt6XnqSKaFFHNO5+FmODxMCWBEaco77lNDGXBM0ECYB/+s7nKFdwSF5hgXumQe\nEZ7amRg39RHy3zIjyRCykQh8Zo2iviRKyTDn/zx6EefptJj2Cw+Ep2FSc01U5ry4KLPYsTyWnVGnvb\nUpyGlhjBUljyjHhWpf8OFaXwhp9O4T1gU9UeyPPa8A2l0p1kNqPXEVRm1AOs1oAGZU596t6SOR2mcB\nOco1srWtkaVrMUzIErrKri85keKqRQYX9VX0/eAUK1hrSu6HMEX3Qh2sCh0q0D2CtnUqS4hj62sE/z\naDs2Sg7MBS6xnQeooc2R2tC9YrKpEi9pLXfYXp20tDCpSP8rKlrD4axprb9u1Df5hSbz9QU0cRpfgn\nkiIzwKucd0wsEHlLpe5yHXuc6FrNelOl7pY2+11kTWx7VpRu97dXA3DO1vbkhcb4zyvERYajQgAADs\n='''), mimetype='image/png')\n\n\nTEMPLATE = u'''\\\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"\n  \"http://www.w3.org/TR/html4/loose.dtd\">\n<title>WSGI Information</title>\n<style type=\"text/css\">\n  @import url(http://fonts.googleapis.com/css?family=Ubuntu);\n\n  body       { font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva',\n               'Verdana', sans-serif; background-color: white; color: #000;\n               font-size: 15px; text-align: center; }\n  #logo      { float: right; padding: 0 0 10px 10px; }\n  div.box    { text-align: left; width: 45em; margin: auto; padding: 50px 0;\n               background-color: white; }\n  h1, h2     { font-family: 'Ubuntu', 'Lucida Grande', 'Lucida Sans Unicode',\n               'Geneva', 'Verdana', sans-serif; font-weight: normal; }\n  h1         { margin: 0 0 30px 0; }\n  h2         { font-size: 1.4em; margin: 1em 0 0.5em 0; }\n  table      { width: 100%%; border-collapse: collapse; border: 1px solid #AFC5C9 }\n  table th   { background-color: #AFC1C4; color: white; font-size: 0.72em;\n               font-weight: normal; width: 18em; vertical-align: top;\n               padding: 0.5em 0 0.1em 0.5em; }\n  table td   { border: 1px solid #AFC5C9; padding: 0.1em 0 0.1em 0.5em; }\n  code       { font-family: 'Consolas', 'Monaco', 'Bitstream Vera Sans Mono',\n               monospace; font-size: 0.7em; }\n  ul li      { line-height: 1.5em; }\n  ul.path    { font-size: 0.7em; margin: 0 -30px; padding: 8px 30px;\n               list-style: none; background: #E8EFF0; }\n  ul.path li { line-height: 1.6em; }\n  li.virtual { color: #999; text-decoration: underline; }\n  li.exp     { background: white; }\n</style>\n<div class=\"box\">\n  <img src=\"?resource=logo\" id=\"logo\" alt=\"[The Werkzeug Logo]\" />\n  <h1>WSGI Information</h1>\n  <p>\n    This page displays all available information about the WSGI server and\n    the underlying Python interpreter.\n  <h2 id=\"python-interpreter\">Python Interpreter</h2>\n  <table>\n    <tr>\n      <th>Python Version\n      <td>%(python_version)s\n    <tr>\n      <th>Platform\n      <td>%(platform)s [%(os)s]\n    <tr>\n      <th>API Version\n      <td>%(api_version)s\n    <tr>\n      <th>Byteorder\n      <td>%(byteorder)s\n    <tr>\n      <th>Werkzeug Version\n      <td>%(werkzeug_version)s\n  </table>\n  <h2 id=\"wsgi-environment\">WSGI Environment</h2>\n  <table>%(wsgi_env)s</table>\n  <h2 id=\"installed-eggs\">Installed Eggs</h2>\n  <p>\n    The following python packages were installed on the system as\n    Python eggs:\n  <ul>%(python_eggs)s</ul>\n  <h2 id=\"sys-path\">System Path</h2>\n  <p>\n    The following paths are the current contents of the load path.  The\n    following entries are looked up for Python packages.  Note that not\n    all items in this path are folders.  Gray and underlined items are\n    entries pointing to invalid resources or used by custom import hooks\n    such as the zip importer.\n  <p>\n    Items with a bright background were expanded for display from a relative\n    path.  If you encounter such paths in the output you might want to check\n    your setup as relative paths are usually problematic in multithreaded\n    environments.\n  <ul class=\"path\">%(sys_path)s</ul>\n</div>\n'''\n\n\ndef iter_sys_path():\n    if os.name == 'posix':\n        def strip(x):\n            prefix = os.path.expanduser('~')\n            if x.startswith(prefix):\n                x = '~' + x[len(prefix):]\n            return x\n    else:\n        strip = lambda x: x\n\n    cwd = os.path.abspath(os.getcwd())\n    for item in sys.path:\n        path = os.path.join(cwd, item or os.path.curdir)\n        yield strip(os.path.normpath(path)), \\\n            not os.path.isdir(path), path != item\n\n\ndef render_testapp(req):\n    try:\n        import pkg_resources\n    except ImportError:\n        eggs = ()\n    else:\n        eggs = sorted(pkg_resources.working_set,\n                      key=lambda x: x.project_name.lower())\n    python_eggs = []\n    for egg in eggs:\n        try:\n            version = egg.version\n        except (ValueError, AttributeError):\n            version = 'unknown'\n        python_eggs.append('<li>%s <small>[%s]</small>' % (\n            escape(egg.project_name),\n            escape(version)\n        ))\n\n    wsgi_env = []\n    sorted_environ = sorted(req.environ.items(),\n                            key=lambda x: repr(x[0]).lower())\n    for key, value in sorted_environ:\n        wsgi_env.append('<tr><th>%s<td><code>%s</code>' % (\n            escape(str(key)),\n            ' '.join(wrap(escape(repr(value))))\n        ))\n\n    sys_path = []\n    for item, virtual, expanded in iter_sys_path():\n        class_ = []\n        if virtual:\n            class_.append('virtual')\n        if expanded:\n            class_.append('exp')\n        sys_path.append('<li%s>%s' % (\n            class_ and ' class=\"%s\"' % ' '.join(class_) or '',\n            escape(item)\n        ))\n\n    return (TEMPLATE % {\n        'python_version':   '<br>'.join(escape(sys.version).splitlines()),\n        'platform':         escape(sys.platform),\n        'os':               escape(os.name),\n        'api_version':      sys.api_version,\n        'byteorder':        sys.byteorder,\n        'werkzeug_version': werkzeug.__version__,\n        'python_eggs':      '\\n'.join(python_eggs),\n        'wsgi_env':         '\\n'.join(wsgi_env),\n        'sys_path':         '\\n'.join(sys_path)\n    }).encode('utf-8')\n\n\ndef test_app(environ, start_response):\n    \"\"\"Simple test application that dumps the environment.  You can use\n    it to check if Werkzeug is working properly:\n\n    .. sourcecode:: pycon\n\n        >>> from werkzeug.serving import run_simple\n        >>> from werkzeug.testapp import test_app\n        >>> run_simple('localhost', 3000, test_app)\n         * Running on http://localhost:3000/\n\n    The application displays important information from the WSGI environment,\n    the Python interpreter and the installed libraries.\n    \"\"\"\n    req = Request(environ, populate_request=False)\n    if req.args.get('resource') == 'logo':\n        response = logo\n    else:\n        response = Response(render_testapp(req), mimetype='text/html')\n    return response(environ, start_response)\n\n\nif __name__ == '__main__':\n    from werkzeug.serving import run_simple\n    run_simple('localhost', 5000, test_app, use_reloader=True)\n"
  },
  {
    "path": "lib/werkzeug/urls.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    werkzeug.urls\n    ~~~~~~~~~~~~~\n\n    ``werkzeug.urls`` used to provide several wrapper functions for Python 2\n    urlparse, whose main purpose were to work around the behavior of the Py2\n    stdlib and its lack of unicode support. While this was already a somewhat\n    inconvenient situation, it got even more complicated because Python 3's\n    ``urllib.parse`` actually does handle unicode properly. In other words,\n    this module would wrap two libraries with completely different behavior. So\n    now this module contains a 2-and-3-compatible backport of Python 3's\n    ``urllib.parse``, which is mostly API-compatible.\n\n    :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nimport os\nimport re\nfrom werkzeug._compat import text_type, PY2, to_unicode, \\\n    to_native, implements_to_string, try_coerce_native, \\\n    normalize_string_tuple, make_literal_wrapper, \\\n    fix_tuple_repr\nfrom werkzeug._internal import _encode_idna, _decode_idna\nfrom werkzeug.datastructures import MultiDict, iter_multi_items\nfrom collections import namedtuple\n\n\n# A regular expression for what a valid schema looks like\n_scheme_re = re.compile(r'^[a-zA-Z0-9+-.]+$')\n\n# Characters that are safe in any part of an URL.\n_always_safe = (b'abcdefghijklmnopqrstuvwxyz'\n                b'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.-+')\n\n_hexdigits = '0123456789ABCDEFabcdef'\n_hextobyte = dict(\n    ((a + b).encode(), int(a + b, 16))\n    for a in _hexdigits for b in _hexdigits\n)\n\n\n_URLTuple = fix_tuple_repr(namedtuple('_URLTuple',\n                                      ['scheme', 'netloc', 'path', 'query', 'fragment']))\n\n\nclass BaseURL(_URLTuple):\n\n    '''Superclass of :py:class:`URL` and :py:class:`BytesURL`.'''\n    __slots__ = ()\n\n    def replace(self, **kwargs):\n        \"\"\"Return an URL with the same values, except for those parameters\n        given new values by whichever keyword arguments are specified.\"\"\"\n        return self._replace(**kwargs)\n\n    @property\n    def host(self):\n        \"\"\"The host part of the URL if available, otherwise `None`.  The\n        host is either the hostname or the IP address mentioned in the\n        URL.  It will not contain the port.\n        \"\"\"\n        return self._split_host()[0]\n\n    @property\n    def ascii_host(self):\n        \"\"\"Works exactly like :attr:`host` but will return a result that\n        is restricted to ASCII.  If it finds a netloc that is not ASCII\n        it will attempt to idna decode it.  This is useful for socket\n        operations when the URL might include internationalized characters.\n        \"\"\"\n        rv = self.host\n        if rv is not None and isinstance(rv, text_type):\n            rv = _encode_idna(rv)\n        return to_native(rv, 'ascii', 'ignore')\n\n    @property\n    def port(self):\n        \"\"\"The port in the URL as an integer if it was present, `None`\n        otherwise.  This does not fill in default ports.\n        \"\"\"\n        try:\n            rv = int(to_native(self._split_host()[1]))\n            if 0 <= rv <= 65535:\n                return rv\n        except (ValueError, TypeError):\n            pass\n\n    @property\n    def auth(self):\n        \"\"\"The authentication part in the URL if available, `None`\n        otherwise.\n        \"\"\"\n        return self._split_netloc()[0]\n\n    @property\n    def username(self):\n        \"\"\"The username if it was part of the URL, `None` otherwise.\n        This undergoes URL decoding and will always be a unicode string.\n        \"\"\"\n        rv = self._split_auth()[0]\n        if rv is not None:\n            return _url_unquote_legacy(rv)\n\n    @property\n    def raw_username(self):\n        \"\"\"The username if it was part of the URL, `None` otherwise.\n        Unlike :attr:`username` this one is not being decoded.\n        \"\"\"\n        return self._split_auth()[0]\n\n    @property\n    def password(self):\n        \"\"\"The password if it was part of the URL, `None` otherwise.\n        This undergoes URL decoding and will always be a unicode string.\n        \"\"\"\n        rv = self._split_auth()[1]\n        if rv is not None:\n            return _url_unquote_legacy(rv)\n\n    @property\n    def raw_password(self):\n        \"\"\"The password if it was part of the URL, `None` otherwise.\n        Unlike :attr:`password` this one is not being decoded.\n        \"\"\"\n        return self._split_auth()[1]\n\n    def decode_query(self, *args, **kwargs):\n        \"\"\"Decodes the query part of the URL.  Ths is a shortcut for\n        calling :func:`url_decode` on the query argument.  The arguments and\n        keyword arguments are forwarded to :func:`url_decode` unchanged.\n        \"\"\"\n        return url_decode(self.query, *args, **kwargs)\n\n    def join(self, *args, **kwargs):\n        \"\"\"Joins this URL with another one.  This is just a convenience\n        function for calling into :meth:`url_join` and then parsing the\n        return value again.\n        \"\"\"\n        return url_parse(url_join(self, *args, **kwargs))\n\n    def to_url(self):\n        \"\"\"Returns a URL string or bytes depending on the type of the\n        information stored.  This is just a convenience function\n        for calling :meth:`url_unparse` for this URL.\n        \"\"\"\n        return url_unparse(self)\n\n    def decode_netloc(self):\n        \"\"\"Decodes the netloc part into a string.\"\"\"\n        rv = _decode_idna(self.host or '')\n\n        if ':' in rv:\n            rv = '[%s]' % rv\n        port = self.port\n        if port is not None:\n            rv = '%s:%d' % (rv, port)\n        auth = ':'.join(filter(None, [\n            _url_unquote_legacy(self.raw_username or '', '/:%@'),\n            _url_unquote_legacy(self.raw_password or '', '/:%@'),\n        ]))\n        if auth:\n            rv = '%s@%s' % (auth, rv)\n        return rv\n\n    def to_uri_tuple(self):\n        \"\"\"Returns a :class:`BytesURL` tuple that holds a URI.  This will\n        encode all the information in the URL properly to ASCII using the\n        rules a web browser would follow.\n\n        It's usually more interesting to directly call :meth:`iri_to_uri` which\n        will return a string.\n        \"\"\"\n        return url_parse(iri_to_uri(self).encode('ascii'))\n\n    def to_iri_tuple(self):\n        \"\"\"Returns a :class:`URL` tuple that holds a IRI.  This will try\n        to decode as much information as possible in the URL without\n        losing information similar to how a web browser does it for the\n        URL bar.\n\n        It's usually more interesting to directly call :meth:`uri_to_iri` which\n        will return a string.\n        \"\"\"\n        return url_parse(uri_to_iri(self))\n\n    def get_file_location(self, pathformat=None):\n        \"\"\"Returns a tuple with the location of the file in the form\n        ``(server, location)``.  If the netloc is empty in the URL or\n        points to localhost, it's represented as ``None``.\n\n        The `pathformat` by default is autodetection but needs to be set\n        when working with URLs of a specific system.  The supported values\n        are ``'windows'`` when working with Windows or DOS paths and\n        ``'posix'`` when working with posix paths.\n\n        If the URL does not point to to a local file, the server and location\n        are both represented as ``None``.\n\n        :param pathformat: The expected format of the path component.\n                           Currently ``'windows'`` and ``'posix'`` are\n                           supported.  Defaults to ``None`` which is\n                           autodetect.\n        \"\"\"\n        if self.scheme != 'file':\n            return None, None\n\n        path = url_unquote(self.path)\n        host = self.netloc or None\n\n        if pathformat is None:\n            if os.name == 'nt':\n                pathformat = 'windows'\n            else:\n                pathformat = 'posix'\n\n        if pathformat == 'windows':\n            if path[:1] == '/' and path[1:2].isalpha() and path[2:3] in '|:':\n                path = path[1:2] + ':' + path[3:]\n            windows_share = path[:3] in ('\\\\' * 3, '/' * 3)\n            import ntpath\n            path = ntpath.normpath(path)\n            # Windows shared drives are represented as ``\\\\host\\\\directory``.\n            # That results in a URL like ``file://///host/directory``, and a\n            # path like ``///host/directory``. We need to special-case this\n            # because the path contains the hostname.\n            if windows_share and host is None:\n                parts = path.lstrip('\\\\').split('\\\\', 1)\n                if len(parts) == 2:\n                    host, path = parts\n                else:\n                    host = parts[0]\n                    path = ''\n        elif pathformat == 'posix':\n            import posixpath\n            path = posixpath.normpath(path)\n        else:\n            raise TypeError('Invalid path format %s' % repr(pathformat))\n\n        if host in ('127.0.0.1', '::1', 'localhost'):\n            host = None\n\n        return host, path\n\n    def _split_netloc(self):\n        if self._at in self.netloc:\n            return self.netloc.split(self._at, 1)\n        return None, self.netloc\n\n    def _split_auth(self):\n        auth = self._split_netloc()[0]\n        if not auth:\n            return None, None\n        if self._colon not in auth:\n            return auth, None\n        return auth.split(self._colon, 1)\n\n    def _split_host(self):\n        rv = self._split_netloc()[1]\n        if not rv:\n            return None, None\n\n        if not rv.startswith(self._lbracket):\n            if self._colon in rv:\n                return rv.split(self._colon, 1)\n            return rv, None\n\n        idx = rv.find(self._rbracket)\n        if idx < 0:\n            return rv, None\n\n        host = rv[1:idx]\n        rest = rv[idx + 1:]\n        if rest.startswith(self._colon):\n            return host, rest[1:]\n        return host, None\n\n\n@implements_to_string\nclass URL(BaseURL):\n\n    \"\"\"Represents a parsed URL.  This behaves like a regular tuple but\n    also has some extra attributes that give further insight into the\n    URL.\n    \"\"\"\n    __slots__ = ()\n    _at = '@'\n    _colon = ':'\n    _lbracket = '['\n    _rbracket = ']'\n\n    def __str__(self):\n        return self.to_url()\n\n    def encode_netloc(self):\n        \"\"\"Encodes the netloc part to an ASCII safe URL as bytes.\"\"\"\n        rv = self.ascii_host or ''\n        if ':' in rv:\n            rv = '[%s]' % rv\n        port = self.port\n        if port is not None:\n            rv = '%s:%d' % (rv, port)\n        auth = ':'.join(filter(None, [\n            url_quote(self.raw_username or '', 'utf-8', 'strict', '/:%'),\n            url_quote(self.raw_password or '', 'utf-8', 'strict', '/:%'),\n        ]))\n        if auth:\n            rv = '%s@%s' % (auth, rv)\n        return to_native(rv)\n\n    def encode(self, charset='utf-8', errors='replace'):\n        \"\"\"Encodes the URL to a tuple made out of bytes.  The charset is\n        only being used for the path, query and fragment.\n        \"\"\"\n        return BytesURL(\n            self.scheme.encode('ascii'),\n            self.encode_netloc(),\n            self.path.encode(charset, errors),\n            self.query.encode(charset, errors),\n            self.fragment.encode(charset, errors)\n        )\n\n\nclass BytesURL(BaseURL):\n\n    \"\"\"Represents a parsed URL in bytes.\"\"\"\n    __slots__ = ()\n    _at = b'@'\n    _colon = b':'\n    _lbracket = b'['\n    _rbracket = b']'\n\n    def __str__(self):\n        return self.to_url().decode('utf-8', 'replace')\n\n    def encode_netloc(self):\n        \"\"\"Returns the netloc unchanged as bytes.\"\"\"\n        return self.netloc\n\n    def decode(self, charset='utf-8', errors='replace'):\n        \"\"\"Decodes the URL to a tuple made out of strings.  The charset is\n        only being used for the path, query and fragment.\n        \"\"\"\n        return URL(\n            self.scheme.decode('ascii'),\n            self.decode_netloc(),\n            self.path.decode(charset, errors),\n            self.query.decode(charset, errors),\n            self.fragment.decode(charset, errors)\n        )\n\n\ndef _unquote_to_bytes(string, unsafe=''):\n    if isinstance(string, text_type):\n        string = string.encode('utf-8')\n    if isinstance(unsafe, text_type):\n        unsafe = unsafe.encode('utf-8')\n    unsafe = frozenset(bytearray(unsafe))\n    bits = iter(string.split(b'%'))\n    result = bytearray(next(bits, b''))\n    for item in bits:\n        try:\n            char = _hextobyte[item[:2]]\n            if char in unsafe:\n                raise KeyError()\n            result.append(char)\n            result.extend(item[2:])\n        except KeyError:\n            result.extend(b'%')\n            result.extend(item)\n    return bytes(result)\n\n\ndef _url_encode_impl(obj, charset, encode_keys, sort, key):\n    iterable = iter_multi_items(obj)\n    if sort:\n        iterable = sorted(iterable, key=key)\n    for key, value in iterable:\n        if value is None:\n            continue\n        if not isinstance(key, bytes):\n            key = text_type(key).encode(charset)\n        if not isinstance(value, bytes):\n            value = text_type(value).encode(charset)\n        yield url_quote_plus(key) + '=' + url_quote_plus(value)\n\n\ndef _url_unquote_legacy(value, unsafe=''):\n    try:\n        return url_unquote(value, charset='utf-8',\n                           errors='strict', unsafe=unsafe)\n    except UnicodeError:\n        return url_unquote(value, charset='latin1', unsafe=unsafe)\n\n\ndef url_parse(url, scheme=None, allow_fragments=True):\n    \"\"\"Parses a URL from a string into a :class:`URL` tuple.  If the URL\n    is lacking a scheme it can be provided as second argument. Otherwise,\n    it is ignored.  Optionally fragments can be stripped from the URL\n    by setting `allow_fragments` to `False`.\n\n    The inverse of this function is :func:`url_unparse`.\n\n    :param url: the URL to parse.\n    :param scheme: the default schema to use if the URL is schemaless.\n    :param allow_fragments: if set to `False` a fragment will be removed\n                            from the URL.\n    \"\"\"\n    s = make_literal_wrapper(url)\n    is_text_based = isinstance(url, text_type)\n\n    if scheme is None:\n        scheme = s('')\n    netloc = query = fragment = s('')\n    i = url.find(s(':'))\n    if i > 0 and _scheme_re.match(to_native(url[:i], errors='replace')):\n        # make sure \"iri\" is not actually a port number (in which case\n        # \"scheme\" is really part of the path)\n        rest = url[i + 1:]\n        if not rest or any(c not in s('0123456789') for c in rest):\n            # not a port number\n            scheme, url = url[:i].lower(), rest\n\n    if url[:2] == s('//'):\n        delim = len(url)\n        for c in s('/?#'):\n            wdelim = url.find(c, 2)\n            if wdelim >= 0:\n                delim = min(delim, wdelim)\n        netloc, url = url[2:delim], url[delim:]\n        if (s('[') in netloc and s(']') not in netloc) or \\\n           (s(']') in netloc and s('[') not in netloc):\n            raise ValueError('Invalid IPv6 URL')\n\n    if allow_fragments and s('#') in url:\n        url, fragment = url.split(s('#'), 1)\n    if s('?') in url:\n        url, query = url.split(s('?'), 1)\n\n    result_type = is_text_based and URL or BytesURL\n    return result_type(scheme, netloc, url, query, fragment)\n\n\ndef url_quote(string, charset='utf-8', errors='strict', safe='/:', unsafe=''):\n    \"\"\"URL encode a single string with a given encoding.\n\n    :param s: the string to quote.\n    :param charset: the charset to be used.\n    :param safe: an optional sequence of safe characters.\n    :param unsafe: an optional sequence of unsafe characters.\n\n    .. versionadded:: 0.9.2\n       The `unsafe` parameter was added.\n    \"\"\"\n    if not isinstance(string, (text_type, bytes, bytearray)):\n        string = text_type(string)\n    if isinstance(string, text_type):\n        string = string.encode(charset, errors)\n    if isinstance(safe, text_type):\n        safe = safe.encode(charset, errors)\n    if isinstance(unsafe, text_type):\n        unsafe = unsafe.encode(charset, errors)\n    safe = frozenset(bytearray(safe) + _always_safe) - frozenset(bytearray(unsafe))\n    rv = bytearray()\n    for char in bytearray(string):\n        if char in safe:\n            rv.append(char)\n        else:\n            rv.extend(('%%%02X' % char).encode('ascii'))\n    return to_native(bytes(rv))\n\n\ndef url_quote_plus(string, charset='utf-8', errors='strict', safe=''):\n    \"\"\"URL encode a single string with the given encoding and convert\n    whitespace to \"+\".\n\n    :param s: The string to quote.\n    :param charset: The charset to be used.\n    :param safe: An optional sequence of safe characters.\n    \"\"\"\n    return url_quote(string, charset, errors, safe + ' ', '+').replace(' ', '+')\n\n\ndef url_unparse(components):\n    \"\"\"The reverse operation to :meth:`url_parse`.  This accepts arbitrary\n    as well as :class:`URL` tuples and returns a URL as a string.\n\n    :param components: the parsed URL as tuple which should be converted\n                       into a URL string.\n    \"\"\"\n    scheme, netloc, path, query, fragment = \\\n        normalize_string_tuple(components)\n    s = make_literal_wrapper(scheme)\n    url = s('')\n\n    # We generally treat file:///x and file:/x the same which is also\n    # what browsers seem to do.  This also allows us to ignore a schema\n    # register for netloc utilization or having to differenciate between\n    # empty and missing netloc.\n    if netloc or (scheme and path.startswith(s('/'))):\n        if path and path[:1] != s('/'):\n            path = s('/') + path\n        url = s('//') + (netloc or s('')) + path\n    elif path:\n        url += path\n    if scheme:\n        url = scheme + s(':') + url\n    if query:\n        url = url + s('?') + query\n    if fragment:\n        url = url + s('#') + fragment\n    return url\n\n\ndef url_unquote(string, charset='utf-8', errors='replace', unsafe=''):\n    \"\"\"URL decode a single string with a given encoding.  If the charset\n    is set to `None` no unicode decoding is performed and raw bytes\n    are returned.\n\n    :param s: the string to unquote.\n    :param charset: the charset of the query string.  If set to `None`\n                    no unicode decoding will take place.\n    :param errors: the error handling for the charset decoding.\n    \"\"\"\n    rv = _unquote_to_bytes(string, unsafe)\n    if charset is not None:\n        rv = rv.decode(charset, errors)\n    return rv\n\n\ndef url_unquote_plus(s, charset='utf-8', errors='replace'):\n    \"\"\"URL decode a single string with the given `charset` and decode \"+\" to\n    whitespace.\n\n    Per default encoding errors are ignored.  If you want a different behavior\n    you can set `errors` to ``'replace'`` or ``'strict'``.  In strict mode a\n    :exc:`HTTPUnicodeError` is raised.\n\n    :param s: The string to unquote.\n    :param charset: the charset of the query string.  If set to `None`\n                    no unicode decoding will take place.\n    :param errors: The error handling for the `charset` decoding.\n    \"\"\"\n    if isinstance(s, text_type):\n        s = s.replace(u'+', u' ')\n    else:\n        s = s.replace(b'+', b' ')\n    return url_unquote(s, charset, errors)\n\n\ndef url_fix(s, charset='utf-8'):\n    r\"\"\"Sometimes you get an URL by a user that just isn't a real URL because\n    it contains unsafe characters like ' ' and so on. This function can fix\n    some of the problems in a similar way browsers handle data entered by the\n    user:\n\n    >>> url_fix(u'http://de.wikipedia.org/wiki/Elf (Begriffskl\\xe4rung)')\n    'http://de.wikipedia.org/wiki/Elf%20(Begriffskl%C3%A4rung)'\n\n    :param s: the string with the URL to fix.\n    :param charset: The target charset for the URL if the url was given as\n                    unicode string.\n    \"\"\"\n    # First step is to switch to unicode processing and to convert\n    # backslashes (which are invalid in URLs anyways) to slashes.  This is\n    # consistent with what Chrome does.\n    s = to_unicode(s, charset, 'replace').replace('\\\\', '/')\n\n    # For the specific case that we look like a malformed windows URL\n    # we want to fix this up manually:\n    if s.startswith('file://') and s[7:8].isalpha() and s[8:10] in (':/', '|/'):\n        s = 'file:///' + s[7:]\n\n    url = url_parse(s)\n    path = url_quote(url.path, charset, safe='/%+$!*\\'(),')\n    qs = url_quote_plus(url.query, charset, safe=':&%=+$!*\\'(),')\n    anchor = url_quote_plus(url.fragment, charset, safe=':&%=+$!*\\'(),')\n    return to_native(url_unparse((url.scheme, url.encode_netloc(),\n                                  path, qs, anchor)))\n\n\ndef uri_to_iri(uri, charset='utf-8', errors='replace'):\n    r\"\"\"\n    Converts a URI in a given charset to a IRI.\n\n    Examples for URI versus IRI:\n\n    >>> uri_to_iri(b'http://xn--n3h.net/')\n    u'http://\\u2603.net/'\n    >>> uri_to_iri(b'http://%C3%BCser:p%C3%A4ssword@xn--n3h.net/p%C3%A5th')\n    u'http://\\xfcser:p\\xe4ssword@\\u2603.net/p\\xe5th'\n\n    Query strings are left unchanged:\n\n    >>> uri_to_iri('/?foo=24&x=%26%2f')\n    u'/?foo=24&x=%26%2f'\n\n    .. versionadded:: 0.6\n\n    :param uri: The URI to convert.\n    :param charset: The charset of the URI.\n    :param errors: The error handling on decode.\n    \"\"\"\n    if isinstance(uri, tuple):\n        uri = url_unparse(uri)\n    uri = url_parse(to_unicode(uri, charset))\n    path = url_unquote(uri.path, charset, errors, '%/;?')\n    query = url_unquote(uri.query, charset, errors, '%;/?:@&=+,$#')\n    fragment = url_unquote(uri.fragment, charset, errors, '%;/?:@&=+,$#')\n    return url_unparse((uri.scheme, uri.decode_netloc(),\n                        path, query, fragment))\n\n\ndef iri_to_uri(iri, charset='utf-8', errors='strict', safe_conversion=False):\n    r\"\"\"\n    Converts any unicode based IRI to an acceptable ASCII URI. Werkzeug always\n    uses utf-8 URLs internally because this is what browsers and HTTP do as\n    well. In some places where it accepts an URL it also accepts a unicode IRI\n    and converts it into a URI.\n\n    Examples for IRI versus URI:\n\n    >>> iri_to_uri(u'http://☃.net/')\n    'http://xn--n3h.net/'\n    >>> iri_to_uri(u'http://üser:pässword@☃.net/påth')\n    'http://%C3%BCser:p%C3%A4ssword@xn--n3h.net/p%C3%A5th'\n\n    There is a general problem with IRI and URI conversion with some\n    protocols that appear in the wild that are in violation of the URI\n    specification.  In places where Werkzeug goes through a forced IRI to\n    URI conversion it will set the `safe_conversion` flag which will\n    not perform a conversion if the end result is already ASCII.  This\n    can mean that the return value is not an entirely correct URI but\n    it will not destroy such invalid URLs in the process.\n\n    As an example consider the following two IRIs::\n\n      magnet:?xt=uri:whatever\n      itms-services://?action=download-manifest\n\n    The internal representation after parsing of those URLs is the same\n    and there is no way to reconstruct the original one.  If safe\n    conversion is enabled however this function becomes a noop for both of\n    those strings as they both can be considered URIs.\n\n    .. versionadded:: 0.6\n\n    .. versionchanged:: 0.9.6\n       The `safe_conversion` parameter was added.\n\n    :param iri: The IRI to convert.\n    :param charset: The charset for the URI.\n    :param safe_conversion: indicates if a safe conversion should take place.\n                            For more information see the explanation above.\n    \"\"\"\n    if isinstance(iri, tuple):\n        iri = url_unparse(iri)\n\n    if safe_conversion:\n        try:\n            native_iri = to_native(iri)\n            ascii_iri = to_native(iri).encode('ascii')\n            if ascii_iri.split() == [ascii_iri]:\n                return native_iri\n        except UnicodeError:\n            pass\n\n    iri = url_parse(to_unicode(iri, charset, errors))\n\n    netloc = iri.encode_netloc()\n    path = url_quote(iri.path, charset, errors, '/:~+%')\n    query = url_quote(iri.query, charset, errors, '%&[]:;$*()+,!?*/=')\n    fragment = url_quote(iri.fragment, charset, errors, '=%&[]:;$()+,!?*/')\n\n    return to_native(url_unparse((iri.scheme, netloc,\n                                  path, query, fragment)))\n\n\ndef url_decode(s, charset='utf-8', decode_keys=False, include_empty=True,\n               errors='replace', separator='&', cls=None):\n    \"\"\"\n    Parse a querystring and return it as :class:`MultiDict`.  There is a\n    difference in key decoding on different Python versions.  On Python 3\n    keys will always be fully decoded whereas on Python 2, keys will\n    remain bytestrings if they fit into ASCII.  On 2.x keys can be forced\n    to be unicode by setting `decode_keys` to `True`.\n\n    If the charset is set to `None` no unicode decoding will happen and\n    raw bytes will be returned.\n\n    Per default a missing value for a key will default to an empty key.  If\n    you don't want that behavior you can set `include_empty` to `False`.\n\n    Per default encoding errors are ignored.  If you want a different behavior\n    you can set `errors` to ``'replace'`` or ``'strict'``.  In strict mode a\n    `HTTPUnicodeError` is raised.\n\n    .. versionchanged:: 0.5\n       In previous versions \";\" and \"&\" could be used for url decoding.\n       This changed in 0.5 where only \"&\" is supported.  If you want to\n       use \";\" instead a different `separator` can be provided.\n\n       The `cls` parameter was added.\n\n    :param s: a string with the query string to decode.\n    :param charset: the charset of the query string.  If set to `None`\n                    no unicode decoding will take place.\n    :param decode_keys: Used on Python 2.x to control whether keys should\n                        be forced to be unicode objects.  If set to `True`\n                        then keys will be unicode in all cases. Otherwise,\n                        they remain `str` if they fit into ASCII.\n    :param include_empty: Set to `False` if you don't want empty values to\n                          appear in the dict.\n    :param errors: the decoding error behavior.\n    :param separator: the pair separator to be used, defaults to ``&``\n    :param cls: an optional dict class to use.  If this is not specified\n                       or `None` the default :class:`MultiDict` is used.\n    \"\"\"\n    if cls is None:\n        cls = MultiDict\n    if isinstance(s, text_type) and not isinstance(separator, text_type):\n        separator = separator.decode(charset or 'ascii')\n    elif isinstance(s, bytes) and not isinstance(separator, bytes):\n        separator = separator.encode(charset or 'ascii')\n    return cls(_url_decode_impl(s.split(separator), charset, decode_keys,\n                                include_empty, errors))\n\n\ndef url_decode_stream(stream, charset='utf-8', decode_keys=False,\n                      include_empty=True, errors='replace', separator='&',\n                      cls=None, limit=None, return_iterator=False):\n    \"\"\"Works like :func:`url_decode` but decodes a stream.  The behavior\n    of stream and limit follows functions like\n    :func:`~werkzeug.wsgi.make_line_iter`.  The generator of pairs is\n    directly fed to the `cls` so you can consume the data while it's\n    parsed.\n\n    .. versionadded:: 0.8\n\n    :param stream: a stream with the encoded querystring\n    :param charset: the charset of the query string.  If set to `None`\n                    no unicode decoding will take place.\n    :param decode_keys: Used on Python 2.x to control whether keys should\n                        be forced to be unicode objects.  If set to `True`,\n                        keys will be unicode in all cases. Otherwise, they\n                        remain `str` if they fit into ASCII.\n    :param include_empty: Set to `False` if you don't want empty values to\n                          appear in the dict.\n    :param errors: the decoding error behavior.\n    :param separator: the pair separator to be used, defaults to ``&``\n    :param cls: an optional dict class to use.  If this is not specified\n                       or `None` the default :class:`MultiDict` is used.\n    :param limit: the content length of the URL data.  Not necessary if\n                  a limited stream is provided.\n    :param return_iterator: if set to `True` the `cls` argument is ignored\n                            and an iterator over all decoded pairs is\n                            returned\n    \"\"\"\n    from werkzeug.wsgi import make_chunk_iter\n    if return_iterator:\n        cls = lambda x: x\n    elif cls is None:\n        cls = MultiDict\n    pair_iter = make_chunk_iter(stream, separator, limit)\n    return cls(_url_decode_impl(pair_iter, charset, decode_keys,\n                                include_empty, errors))\n\n\ndef _url_decode_impl(pair_iter, charset, decode_keys, include_empty, errors):\n    for pair in pair_iter:\n        if not pair:\n            continue\n        s = make_literal_wrapper(pair)\n        equal = s('=')\n        if equal in pair:\n            key, value = pair.split(equal, 1)\n        else:\n            if not include_empty:\n                continue\n            key = pair\n            value = s('')\n        key = url_unquote_plus(key, charset, errors)\n        if charset is not None and PY2 and not decode_keys:\n            key = try_coerce_native(key)\n        yield key, url_unquote_plus(value, charset, errors)\n\n\ndef url_encode(obj, charset='utf-8', encode_keys=False, sort=False, key=None,\n               separator=b'&'):\n    \"\"\"URL encode a dict/`MultiDict`.  If a value is `None` it will not appear\n    in the result string.  Per default only values are encoded into the target\n    charset strings.  If `encode_keys` is set to ``True`` unicode keys are\n    supported too.\n\n    If `sort` is set to `True` the items are sorted by `key` or the default\n    sorting algorithm.\n\n    .. versionadded:: 0.5\n        `sort`, `key`, and `separator` were added.\n\n    :param obj: the object to encode into a query string.\n    :param charset: the charset of the query string.\n    :param encode_keys: set to `True` if you have unicode keys. (Ignored on\n                        Python 3.x)\n    :param sort: set to `True` if you want parameters to be sorted by `key`.\n    :param separator: the separator to be used for the pairs.\n    :param key: an optional function to be used for sorting.  For more details\n                check out the :func:`sorted` documentation.\n    \"\"\"\n    separator = to_native(separator, 'ascii')\n    return separator.join(_url_encode_impl(obj, charset, encode_keys, sort, key))\n\n\ndef url_encode_stream(obj, stream=None, charset='utf-8', encode_keys=False,\n                      sort=False, key=None, separator=b'&'):\n    \"\"\"Like :meth:`url_encode` but writes the results to a stream\n    object.  If the stream is `None` a generator over all encoded\n    pairs is returned.\n\n    .. versionadded:: 0.8\n\n    :param obj: the object to encode into a query string.\n    :param stream: a stream to write the encoded object into or `None` if\n                   an iterator over the encoded pairs should be returned.  In\n                   that case the separator argument is ignored.\n    :param charset: the charset of the query string.\n    :param encode_keys: set to `True` if you have unicode keys. (Ignored on\n                        Python 3.x)\n    :param sort: set to `True` if you want parameters to be sorted by `key`.\n    :param separator: the separator to be used for the pairs.\n    :param key: an optional function to be used for sorting.  For more details\n                check out the :func:`sorted` documentation.\n    \"\"\"\n    separator = to_native(separator, 'ascii')\n    gen = _url_encode_impl(obj, charset, encode_keys, sort, key)\n    if stream is None:\n        return gen\n    for idx, chunk in enumerate(gen):\n        if idx:\n            stream.write(separator)\n        stream.write(chunk)\n\n\ndef url_join(base, url, allow_fragments=True):\n    \"\"\"Join a base URL and a possibly relative URL to form an absolute\n    interpretation of the latter.\n\n    :param base: the base URL for the join operation.\n    :param url: the URL to join.\n    :param allow_fragments: indicates whether fragments should be allowed.\n    \"\"\"\n    if isinstance(base, tuple):\n        base = url_unparse(base)\n    if isinstance(url, tuple):\n        url = url_unparse(url)\n\n    base, url = normalize_string_tuple((base, url))\n    s = make_literal_wrapper(base)\n\n    if not base:\n        return url\n    if not url:\n        return base\n\n    bscheme, bnetloc, bpath, bquery, bfragment = \\\n        url_parse(base, allow_fragments=allow_fragments)\n    scheme, netloc, path, query, fragment = \\\n        url_parse(url, bscheme, allow_fragments)\n    if scheme != bscheme:\n        return url\n    if netloc:\n        return url_unparse((scheme, netloc, path, query, fragment))\n    netloc = bnetloc\n\n    if path[:1] == s('/'):\n        segments = path.split(s('/'))\n    elif not path:\n        segments = bpath.split(s('/'))\n        if not query:\n            query = bquery\n    else:\n        segments = bpath.split(s('/'))[:-1] + path.split(s('/'))\n\n    # If the rightmost part is \"./\" we want to keep the slash but\n    # remove the dot.\n    if segments[-1] == s('.'):\n        segments[-1] = s('')\n\n    # Resolve \"..\" and \".\"\n    segments = [segment for segment in segments if segment != s('.')]\n    while 1:\n        i = 1\n        n = len(segments) - 1\n        while i < n:\n            if segments[i] == s('..') and \\\n               segments[i - 1] not in (s(''), s('..')):\n                del segments[i - 1:i + 1]\n                break\n            i += 1\n        else:\n            break\n\n    # Remove trailing \"..\" if the URL is absolute\n    unwanted_marker = [s(''), s('..')]\n    while segments[:2] == unwanted_marker:\n        del segments[1]\n\n    path = s('/').join(segments)\n    return url_unparse((scheme, netloc, path, query, fragment))\n\n\nclass Href(object):\n\n    \"\"\"Implements a callable that constructs URLs with the given base. The\n    function can be called with any number of positional and keyword\n    arguments which than are used to assemble the URL.  Works with URLs\n    and posix paths.\n\n    Positional arguments are appended as individual segments to\n    the path of the URL:\n\n    >>> href = Href('/foo')\n    >>> href('bar', 23)\n    '/foo/bar/23'\n    >>> href('foo', bar=23)\n    '/foo/foo?bar=23'\n\n    If any of the arguments (positional or keyword) evaluates to `None` it\n    will be skipped.  If no keyword arguments are given the last argument\n    can be a :class:`dict` or :class:`MultiDict` (or any other dict subclass),\n    otherwise the keyword arguments are used for the query parameters, cutting\n    off the first trailing underscore of the parameter name:\n\n    >>> href(is_=42)\n    '/foo?is=42'\n    >>> href({'foo': 'bar'})\n    '/foo?foo=bar'\n\n    Combining of both methods is not allowed:\n\n    >>> href({'foo': 'bar'}, bar=42)\n    Traceback (most recent call last):\n      ...\n    TypeError: keyword arguments and query-dicts can't be combined\n\n    Accessing attributes on the href object creates a new href object with\n    the attribute name as prefix:\n\n    >>> bar_href = href.bar\n    >>> bar_href(\"blub\")\n    '/foo/bar/blub'\n\n    If `sort` is set to `True` the items are sorted by `key` or the default\n    sorting algorithm:\n\n    >>> href = Href(\"/\", sort=True)\n    >>> href(a=1, b=2, c=3)\n    '/?a=1&b=2&c=3'\n\n    .. versionadded:: 0.5\n        `sort` and `key` were added.\n    \"\"\"\n\n    def __init__(self, base='./', charset='utf-8', sort=False, key=None):\n        if not base:\n            base = './'\n        self.base = base\n        self.charset = charset\n        self.sort = sort\n        self.key = key\n\n    def __getattr__(self, name):\n        if name[:2] == '__':\n            raise AttributeError(name)\n        base = self.base\n        if base[-1:] != '/':\n            base += '/'\n        return Href(url_join(base, name), self.charset, self.sort, self.key)\n\n    def __call__(self, *path, **query):\n        if path and isinstance(path[-1], dict):\n            if query:\n                raise TypeError('keyword arguments and query-dicts '\n                                'can\\'t be combined')\n            query, path = path[-1], path[:-1]\n        elif query:\n            query = dict([(k.endswith('_') and k[:-1] or k, v)\n                          for k, v in query.items()])\n        path = '/'.join([to_unicode(url_quote(x, self.charset), 'ascii')\n                         for x in path if x is not None]).lstrip('/')\n        rv = self.base\n        if path:\n            if not rv.endswith('/'):\n                rv += '/'\n            rv = url_join(rv, './' + path)\n        if query:\n            rv += '?' + to_unicode(url_encode(query, self.charset, sort=self.sort,\n                                              key=self.key), 'ascii')\n        return to_native(rv)\n"
  },
  {
    "path": "lib/werkzeug/useragents.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    werkzeug.useragents\n    ~~~~~~~~~~~~~~~~~~~\n\n    This module provides a helper to inspect user agent strings.  This module\n    is far from complete but should work for most of the currently available\n    browsers.\n\n\n    :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nimport re\n\n\nclass UserAgentParser(object):\n\n    \"\"\"A simple user agent parser.  Used by the `UserAgent`.\"\"\"\n\n    platforms = (\n        ('cros', 'chromeos'),\n        ('iphone|ios', 'iphone'),\n        ('ipad', 'ipad'),\n        (r'darwin|mac|os\\s*x', 'macos'),\n        ('win', 'windows'),\n        (r'android', 'android'),\n        (r'x11|lin(\\b|ux)?', 'linux'),\n        ('(sun|i86)os', 'solaris'),\n        (r'nintendo\\s+wii', 'wii'),\n        ('irix', 'irix'),\n        ('hp-?ux', 'hpux'),\n        ('aix', 'aix'),\n        ('sco|unix_sv', 'sco'),\n        ('bsd', 'bsd'),\n        ('amiga', 'amiga'),\n        ('blackberry|playbook', 'blackberry'),\n        ('symbian', 'symbian')\n    )\n    browsers = (\n        ('googlebot', 'google'),\n        ('msnbot', 'msn'),\n        ('yahoo', 'yahoo'),\n        ('ask jeeves', 'ask'),\n        (r'aol|america\\s+online\\s+browser', 'aol'),\n        ('opera', 'opera'),\n        ('chrome', 'chrome'),\n        ('firefox|firebird|phoenix|iceweasel', 'firefox'),\n        ('galeon', 'galeon'),\n        ('safari|version', 'safari'),\n        ('webkit', 'webkit'),\n        ('camino', 'camino'),\n        ('konqueror', 'konqueror'),\n        ('k-meleon', 'kmeleon'),\n        ('netscape', 'netscape'),\n        (r'msie|microsoft\\s+internet\\s+explorer|trident/.+? rv:', 'msie'),\n        ('lynx', 'lynx'),\n        ('links', 'links'),\n        ('seamonkey|mozilla', 'seamonkey')\n    )\n\n    _browser_version_re = r'(?:%s)[/\\sa-z(]*(\\d+[.\\da-z]+)?(?i)'\n    _language_re = re.compile(\n        r'(?:;\\s*|\\s+)(\\b\\w{2}\\b(?:-\\b\\w{2}\\b)?)\\s*;|'\n        r'(?:\\(|\\[|;)\\s*(\\b\\w{2}\\b(?:-\\b\\w{2}\\b)?)\\s*(?:\\]|\\)|;)'\n    )\n\n    def __init__(self):\n        self.platforms = [(b, re.compile(a, re.I)) for a, b in self.platforms]\n        self.browsers = [(b, re.compile(self._browser_version_re % a))\n                         for a, b in self.browsers]\n\n    def __call__(self, user_agent):\n        for platform, regex in self.platforms:\n            match = regex.search(user_agent)\n            if match is not None:\n                break\n        else:\n            platform = None\n        for browser, regex in self.browsers:\n            match = regex.search(user_agent)\n            if match is not None:\n                version = match.group(1)\n                break\n        else:\n            browser = version = None\n        match = self._language_re.search(user_agent)\n        if match is not None:\n            language = match.group(1) or match.group(2)\n        else:\n            language = None\n        return platform, browser, version, language\n\n\nclass UserAgent(object):\n\n    \"\"\"Represents a user agent.  Pass it a WSGI environment or a user agent\n    string and you can inspect some of the details from the user agent\n    string via the attributes.  The following attributes exist:\n\n    .. attribute:: string\n\n       the raw user agent string\n\n    .. attribute:: platform\n\n       the browser platform.  The following platforms are currently\n       recognized:\n\n       -   `aix`\n       -   `amiga`\n       -   `android`\n       -   `bsd`\n       -   `chromeos`\n       -   `hpux`\n       -   `iphone`\n       -   `ipad`\n       -   `irix`\n       -   `linux`\n       -   `macos`\n       -   `sco`\n       -   `solaris`\n       -   `wii`\n       -   `windows`\n\n    .. attribute:: browser\n\n        the name of the browser.  The following browsers are currently\n        recognized:\n\n        -   `aol` *\n        -   `ask` *\n        -   `camino`\n        -   `chrome`\n        -   `firefox`\n        -   `galeon`\n        -   `google` *\n        -   `kmeleon`\n        -   `konqueror`\n        -   `links`\n        -   `lynx`\n        -   `msie`\n        -   `msn`\n        -   `netscape`\n        -   `opera`\n        -   `safari`\n        -   `seamonkey`\n        -   `webkit`\n        -   `yahoo` *\n\n        (Browsers maked with a star (``*``) are crawlers.)\n\n    .. attribute:: version\n\n        the version of the browser\n\n    .. attribute:: language\n\n        the language of the browser\n    \"\"\"\n\n    _parser = UserAgentParser()\n\n    def __init__(self, environ_or_string):\n        if isinstance(environ_or_string, dict):\n            environ_or_string = environ_or_string.get('HTTP_USER_AGENT', '')\n        self.string = environ_or_string\n        self.platform, self.browser, self.version, self.language = \\\n            self._parser(environ_or_string)\n\n    def to_header(self):\n        return self.string\n\n    def __str__(self):\n        return self.string\n\n    def __nonzero__(self):\n        return bool(self.browser)\n\n    __bool__ = __nonzero__\n\n    def __repr__(self):\n        return '<%s %r/%s>' % (\n            self.__class__.__name__,\n            self.browser,\n            self.version\n        )\n\n\n# conceptionally this belongs in this module but because we want to lazily\n# load the user agent module (which happens in wrappers.py) we have to import\n# it afterwards.  The class itself has the module set to this module so\n# pickle, inspect and similar modules treat the object as if it was really\n# implemented here.\nfrom werkzeug.wrappers import UserAgentMixin  # noqa\n"
  },
  {
    "path": "lib/werkzeug/utils.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    werkzeug.utils\n    ~~~~~~~~~~~~~~\n\n    This module implements various utilities for WSGI applications.  Most of\n    them are used by the request and response wrappers but especially for\n    middleware development it makes sense to use them without the wrappers.\n\n    :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nimport re\nimport os\nimport sys\nimport pkgutil\ntry:\n    from html.entities import name2codepoint\nexcept ImportError:\n    from htmlentitydefs import name2codepoint\n\nfrom werkzeug._compat import unichr, text_type, string_types, iteritems, \\\n    reraise, PY2\nfrom werkzeug._internal import _DictAccessorProperty, \\\n    _parse_signature, _missing\n\n\n_format_re = re.compile(r'\\$(?:(%s)|\\{(%s)\\})' % (('[a-zA-Z_][a-zA-Z0-9_]*',) * 2))\n_entity_re = re.compile(r'&([^;]+);')\n_filename_ascii_strip_re = re.compile(r'[^A-Za-z0-9_.-]')\n_windows_device_files = ('CON', 'AUX', 'COM1', 'COM2', 'COM3', 'COM4', 'LPT1',\n                         'LPT2', 'LPT3', 'PRN', 'NUL')\n\n\nclass cached_property(property):\n\n    \"\"\"A decorator that converts a function into a lazy property.  The\n    function wrapped is called the first time to retrieve the result\n    and then that calculated result is used the next time you access\n    the value::\n\n        class Foo(object):\n\n            @cached_property\n            def foo(self):\n                # calculate something important here\n                return 42\n\n    The class has to have a `__dict__` in order for this property to\n    work.\n    \"\"\"\n\n    # implementation detail: A subclass of python's builtin property\n    # decorator, we override __get__ to check for a cached value. If one\n    # choses to invoke __get__ by hand the property will still work as\n    # expected because the lookup logic is replicated in __get__ for\n    # manual invocation.\n\n    def __init__(self, func, name=None, doc=None):\n        self.__name__ = name or func.__name__\n        self.__module__ = func.__module__\n        self.__doc__ = doc or func.__doc__\n        self.func = func\n\n    def __set__(self, obj, value):\n        obj.__dict__[self.__name__] = value\n\n    def __get__(self, obj, type=None):\n        if obj is None:\n            return self\n        value = obj.__dict__.get(self.__name__, _missing)\n        if value is _missing:\n            value = self.func(obj)\n            obj.__dict__[self.__name__] = value\n        return value\n\n\nclass environ_property(_DictAccessorProperty):\n\n    \"\"\"Maps request attributes to environment variables. This works not only\n    for the Werzeug request object, but also any other class with an\n    environ attribute:\n\n    >>> class Test(object):\n    ...     environ = {'key': 'value'}\n    ...     test = environ_property('key')\n    >>> var = Test()\n    >>> var.test\n    'value'\n\n    If you pass it a second value it's used as default if the key does not\n    exist, the third one can be a converter that takes a value and converts\n    it.  If it raises :exc:`ValueError` or :exc:`TypeError` the default value\n    is used. If no default value is provided `None` is used.\n\n    Per default the property is read only.  You have to explicitly enable it\n    by passing ``read_only=False`` to the constructor.\n    \"\"\"\n\n    read_only = True\n\n    def lookup(self, obj):\n        return obj.environ\n\n\nclass header_property(_DictAccessorProperty):\n\n    \"\"\"Like `environ_property` but for headers.\"\"\"\n\n    def lookup(self, obj):\n        return obj.headers\n\n\nclass HTMLBuilder(object):\n\n    \"\"\"Helper object for HTML generation.\n\n    Per default there are two instances of that class.  The `html` one, and\n    the `xhtml` one for those two dialects.  The class uses keyword parameters\n    and positional parameters to generate small snippets of HTML.\n\n    Keyword parameters are converted to XML/SGML attributes, positional\n    arguments are used as children.  Because Python accepts positional\n    arguments before keyword arguments it's a good idea to use a list with the\n    star-syntax for some children:\n\n    >>> html.p(class_='foo', *[html.a('foo', href='foo.html'), ' ',\n    ...                        html.a('bar', href='bar.html')])\n    u'<p class=\"foo\"><a href=\"foo.html\">foo</a> <a href=\"bar.html\">bar</a></p>'\n\n    This class works around some browser limitations and can not be used for\n    arbitrary SGML/XML generation.  For that purpose lxml and similar\n    libraries exist.\n\n    Calling the builder escapes the string passed:\n\n    >>> html.p(html(\"<foo>\"))\n    u'<p>&lt;foo&gt;</p>'\n    \"\"\"\n\n    _entity_re = re.compile(r'&([^;]+);')\n    _entities = name2codepoint.copy()\n    _entities['apos'] = 39\n    _empty_elements = set([\n        'area', 'base', 'basefont', 'br', 'col', 'command', 'embed', 'frame',\n        'hr', 'img', 'input', 'keygen', 'isindex', 'link', 'meta', 'param',\n        'source', 'wbr'\n    ])\n    _boolean_attributes = set([\n        'selected', 'checked', 'compact', 'declare', 'defer', 'disabled',\n        'ismap', 'multiple', 'nohref', 'noresize', 'noshade', 'nowrap'\n    ])\n    _plaintext_elements = set(['textarea'])\n    _c_like_cdata = set(['script', 'style'])\n\n    def __init__(self, dialect):\n        self._dialect = dialect\n\n    def __call__(self, s):\n        return escape(s)\n\n    def __getattr__(self, tag):\n        if tag[:2] == '__':\n            raise AttributeError(tag)\n\n        def proxy(*children, **arguments):\n            buffer = '<' + tag\n            for key, value in iteritems(arguments):\n                if value is None:\n                    continue\n                if key[-1] == '_':\n                    key = key[:-1]\n                if key in self._boolean_attributes:\n                    if not value:\n                        continue\n                    if self._dialect == 'xhtml':\n                        value = '=\"' + key + '\"'\n                    else:\n                        value = ''\n                else:\n                    value = '=\"' + escape(value) + '\"'\n                buffer += ' ' + key + value\n            if not children and tag in self._empty_elements:\n                if self._dialect == 'xhtml':\n                    buffer += ' />'\n                else:\n                    buffer += '>'\n                return buffer\n            buffer += '>'\n\n            children_as_string = ''.join([text_type(x) for x in children\n                                          if x is not None])\n\n            if children_as_string:\n                if tag in self._plaintext_elements:\n                    children_as_string = escape(children_as_string)\n                elif tag in self._c_like_cdata and self._dialect == 'xhtml':\n                    children_as_string = '/*<![CDATA[*/' + \\\n                                         children_as_string + '/*]]>*/'\n            buffer += children_as_string + '</' + tag + '>'\n            return buffer\n        return proxy\n\n    def __repr__(self):\n        return '<%s for %r>' % (\n            self.__class__.__name__,\n            self._dialect\n        )\n\n\nhtml = HTMLBuilder('html')\nxhtml = HTMLBuilder('xhtml')\n\n\ndef get_content_type(mimetype, charset):\n    \"\"\"Returns the full content type string with charset for a mimetype.\n\n    If the mimetype represents text the charset will be appended as charset\n    parameter, otherwise the mimetype is returned unchanged.\n\n    :param mimetype: the mimetype to be used as content type.\n    :param charset: the charset to be appended in case it was a text mimetype.\n    :return: the content type.\n    \"\"\"\n    if mimetype.startswith('text/') or \\\n       mimetype == 'application/xml' or \\\n       (mimetype.startswith('application/') and\n            mimetype.endswith('+xml')):\n        mimetype += '; charset=' + charset\n    return mimetype\n\n\ndef format_string(string, context):\n    \"\"\"String-template format a string:\n\n    >>> format_string('$foo and ${foo}s', dict(foo=42))\n    '42 and 42s'\n\n    This does not do any attribute lookup etc.  For more advanced string\n    formattings have a look at the `werkzeug.template` module.\n\n    :param string: the format string.\n    :param context: a dict with the variables to insert.\n    \"\"\"\n    def lookup_arg(match):\n        x = context[match.group(1) or match.group(2)]\n        if not isinstance(x, string_types):\n            x = type(string)(x)\n        return x\n    return _format_re.sub(lookup_arg, string)\n\n\ndef secure_filename(filename):\n    r\"\"\"Pass it a filename and it will return a secure version of it.  This\n    filename can then safely be stored on a regular file system and passed\n    to :func:`os.path.join`.  The filename returned is an ASCII only string\n    for maximum portability.\n\n    On windows systems the function also makes sure that the file is not\n    named after one of the special device files.\n\n    >>> secure_filename(\"My cool movie.mov\")\n    'My_cool_movie.mov'\n    >>> secure_filename(\"../../../etc/passwd\")\n    'etc_passwd'\n    >>> secure_filename(u'i contain cool \\xfcml\\xe4uts.txt')\n    'i_contain_cool_umlauts.txt'\n\n    The function might return an empty filename.  It's your responsibility\n    to ensure that the filename is unique and that you generate random\n    filename if the function returned an empty one.\n\n    .. versionadded:: 0.5\n\n    :param filename: the filename to secure\n    \"\"\"\n    if isinstance(filename, text_type):\n        from unicodedata import normalize\n        filename = normalize('NFKD', filename).encode('ascii', 'ignore')\n        if not PY2:\n            filename = filename.decode('ascii')\n    for sep in os.path.sep, os.path.altsep:\n        if sep:\n            filename = filename.replace(sep, ' ')\n    filename = str(_filename_ascii_strip_re.sub('', '_'.join(\n                   filename.split()))).strip('._')\n\n    # on nt a couple of special files are present in each folder.  We\n    # have to ensure that the target file is not such a filename.  In\n    # this case we prepend an underline\n    if os.name == 'nt' and filename and \\\n       filename.split('.')[0].upper() in _windows_device_files:\n        filename = '_' + filename\n\n    return filename\n\n\ndef escape(s, quote=None):\n    \"\"\"Replace special characters \"&\", \"<\", \">\" and (\") to HTML-safe sequences.\n\n    There is a special handling for `None` which escapes to an empty string.\n\n    .. versionchanged:: 0.9\n       `quote` is now implicitly on.\n\n    :param s: the string to escape.\n    :param quote: ignored.\n    \"\"\"\n    if s is None:\n        return ''\n    elif hasattr(s, '__html__'):\n        return text_type(s.__html__())\n    elif not isinstance(s, string_types):\n        s = text_type(s)\n    if quote is not None:\n        from warnings import warn\n        warn(DeprecationWarning('quote parameter is implicit now'), stacklevel=2)\n    s = s.replace('&', '&amp;').replace('<', '&lt;') \\\n        .replace('>', '&gt;').replace('\"', \"&quot;\")\n    return s\n\n\ndef unescape(s):\n    \"\"\"The reverse function of `escape`.  This unescapes all the HTML\n    entities, not only the XML entities inserted by `escape`.\n\n    :param s: the string to unescape.\n    \"\"\"\n    def handle_match(m):\n        name = m.group(1)\n        if name in HTMLBuilder._entities:\n            return unichr(HTMLBuilder._entities[name])\n        try:\n            if name[:2] in ('#x', '#X'):\n                return unichr(int(name[2:], 16))\n            elif name.startswith('#'):\n                return unichr(int(name[1:]))\n        except ValueError:\n            pass\n        return u''\n    return _entity_re.sub(handle_match, s)\n\n\ndef redirect(location, code=302, Response=None):\n    \"\"\"Returns a response object (a WSGI application) that, if called,\n    redirects the client to the target location.  Supported codes are 301,\n    302, 303, 305, and 307.  300 is not supported because it's not a real\n    redirect and 304 because it's the answer for a request with a request\n    with defined If-Modified-Since headers.\n\n    .. versionadded:: 0.6\n       The location can now be a unicode string that is encoded using\n       the :func:`iri_to_uri` function.\n\n    .. versionadded:: 0.10\n        The class used for the Response object can now be passed in.\n\n    :param location: the location the response should redirect to.\n    :param code: the redirect status code. defaults to 302.\n    :param class Response: a Response class to use when instantiating a\n        response. The default is :class:`werkzeug.wrappers.Response` if\n        unspecified.\n    \"\"\"\n    if Response is None:\n        from werkzeug.wrappers import Response\n\n    display_location = escape(location)\n    if isinstance(location, text_type):\n        # Safe conversion is necessary here as we might redirect\n        # to a broken URI scheme (for instance itms-services).\n        from werkzeug.urls import iri_to_uri\n        location = iri_to_uri(location, safe_conversion=True)\n    response = Response(\n        '<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\\n'\n        '<title>Redirecting...</title>\\n'\n        '<h1>Redirecting...</h1>\\n'\n        '<p>You should be redirected automatically to target URL: '\n        '<a href=\"%s\">%s</a>.  If not click the link.' %\n        (escape(location), display_location), code, mimetype='text/html')\n    response.headers['Location'] = location\n    return response\n\n\ndef append_slash_redirect(environ, code=301):\n    \"\"\"Redirects to the same URL but with a slash appended.  The behavior\n    of this function is undefined if the path ends with a slash already.\n\n    :param environ: the WSGI environment for the request that triggers\n                    the redirect.\n    :param code: the status code for the redirect.\n    \"\"\"\n    new_path = environ['PATH_INFO'].strip('/') + '/'\n    query_string = environ.get('QUERY_STRING')\n    if query_string:\n        new_path += '?' + query_string\n    return redirect(new_path, code)\n\n\ndef import_string(import_name, silent=False):\n    \"\"\"Imports an object based on a string.  This is useful if you want to\n    use import paths as endpoints or something similar.  An import path can\n    be specified either in dotted notation (``xml.sax.saxutils.escape``)\n    or with a colon as object delimiter (``xml.sax.saxutils:escape``).\n\n    If `silent` is True the return value will be `None` if the import fails.\n\n    :param import_name: the dotted name for the object to import.\n    :param silent: if set to `True` import errors are ignored and\n                   `None` is returned instead.\n    :return: imported object\n    \"\"\"\n    # force the import name to automatically convert to strings\n    # __import__ is not able to handle unicode strings in the fromlist\n    # if the module is a package\n    import_name = str(import_name).replace(':', '.')\n    try:\n        try:\n            __import__(import_name)\n        except ImportError:\n            if '.' not in import_name:\n                raise\n        else:\n            return sys.modules[import_name]\n\n        module_name, obj_name = import_name.rsplit('.', 1)\n        try:\n            module = __import__(module_name, None, None, [obj_name])\n        except ImportError:\n            # support importing modules not yet set up by the parent module\n            # (or package for that matter)\n            module = import_string(module_name)\n\n        try:\n            return getattr(module, obj_name)\n        except AttributeError as e:\n            raise ImportError(e)\n\n    except ImportError as e:\n        if not silent:\n            reraise(\n                ImportStringError,\n                ImportStringError(import_name, e),\n                sys.exc_info()[2])\n\n\ndef find_modules(import_path, include_packages=False, recursive=False):\n    \"\"\"Finds all the modules below a package.  This can be useful to\n    automatically import all views / controllers so that their metaclasses /\n    function decorators have a chance to register themselves on the\n    application.\n\n    Packages are not returned unless `include_packages` is `True`.  This can\n    also recursively list modules but in that case it will import all the\n    packages to get the correct load path of that module.\n\n    :param import_name: the dotted name for the package to find child modules.\n    :param include_packages: set to `True` if packages should be returned, too.\n    :param recursive: set to `True` if recursion should happen.\n    :return: generator\n    \"\"\"\n    module = import_string(import_path)\n    path = getattr(module, '__path__', None)\n    if path is None:\n        raise ValueError('%r is not a package' % import_path)\n    basename = module.__name__ + '.'\n    for importer, modname, ispkg in pkgutil.iter_modules(path):\n        modname = basename + modname\n        if ispkg:\n            if include_packages:\n                yield modname\n            if recursive:\n                for item in find_modules(modname, include_packages, True):\n                    yield item\n        else:\n            yield modname\n\n\ndef validate_arguments(func, args, kwargs, drop_extra=True):\n    \"\"\"Checks if the function accepts the arguments and keyword arguments.\n    Returns a new ``(args, kwargs)`` tuple that can safely be passed to\n    the function without causing a `TypeError` because the function signature\n    is incompatible.  If `drop_extra` is set to `True` (which is the default)\n    any extra positional or keyword arguments are dropped automatically.\n\n    The exception raised provides three attributes:\n\n    `missing`\n        A set of argument names that the function expected but where\n        missing.\n\n    `extra`\n        A dict of keyword arguments that the function can not handle but\n        where provided.\n\n    `extra_positional`\n        A list of values that where given by positional argument but the\n        function cannot accept.\n\n    This can be useful for decorators that forward user submitted data to\n    a view function::\n\n        from werkzeug.utils import ArgumentValidationError, validate_arguments\n\n        def sanitize(f):\n            def proxy(request):\n                data = request.values.to_dict()\n                try:\n                    args, kwargs = validate_arguments(f, (request,), data)\n                except ArgumentValidationError:\n                    raise BadRequest('The browser failed to transmit all '\n                                     'the data expected.')\n                return f(*args, **kwargs)\n            return proxy\n\n    :param func: the function the validation is performed against.\n    :param args: a tuple of positional arguments.\n    :param kwargs: a dict of keyword arguments.\n    :param drop_extra: set to `False` if you don't want extra arguments\n                       to be silently dropped.\n    :return: tuple in the form ``(args, kwargs)``.\n    \"\"\"\n    parser = _parse_signature(func)\n    args, kwargs, missing, extra, extra_positional = parser(args, kwargs)[:5]\n    if missing:\n        raise ArgumentValidationError(tuple(missing))\n    elif (extra or extra_positional) and not drop_extra:\n        raise ArgumentValidationError(None, extra, extra_positional)\n    return tuple(args), kwargs\n\n\ndef bind_arguments(func, args, kwargs):\n    \"\"\"Bind the arguments provided into a dict.  When passed a function,\n    a tuple of arguments and a dict of keyword arguments `bind_arguments`\n    returns a dict of names as the function would see it.  This can be useful\n    to implement a cache decorator that uses the function arguments to build\n    the cache key based on the values of the arguments.\n\n    :param func: the function the arguments should be bound for.\n    :param args: tuple of positional arguments.\n    :param kwargs: a dict of keyword arguments.\n    :return: a :class:`dict` of bound keyword arguments.\n    \"\"\"\n    args, kwargs, missing, extra, extra_positional, \\\n        arg_spec, vararg_var, kwarg_var = _parse_signature(func)(args, kwargs)\n    values = {}\n    for (name, has_default, default), value in zip(arg_spec, args):\n        values[name] = value\n    if vararg_var is not None:\n        values[vararg_var] = tuple(extra_positional)\n    elif extra_positional:\n        raise TypeError('too many positional arguments')\n    if kwarg_var is not None:\n        multikw = set(extra) & set([x[0] for x in arg_spec])\n        if multikw:\n            raise TypeError('got multiple values for keyword argument ' +\n                            repr(next(iter(multikw))))\n        values[kwarg_var] = extra\n    elif extra:\n        raise TypeError('got unexpected keyword argument ' +\n                        repr(next(iter(extra))))\n    return values\n\n\nclass ArgumentValidationError(ValueError):\n\n    \"\"\"Raised if :func:`validate_arguments` fails to validate\"\"\"\n\n    def __init__(self, missing=None, extra=None, extra_positional=None):\n        self.missing = set(missing or ())\n        self.extra = extra or {}\n        self.extra_positional = extra_positional or []\n        ValueError.__init__(self, 'function arguments invalid.  ('\n                            '%d missing, %d additional)' % (\n                                len(self.missing),\n                                len(self.extra) + len(self.extra_positional)\n                            ))\n\n\nclass ImportStringError(ImportError):\n\n    \"\"\"Provides information about a failed :func:`import_string` attempt.\"\"\"\n\n    #: String in dotted notation that failed to be imported.\n    import_name = None\n    #: Wrapped exception.\n    exception = None\n\n    def __init__(self, import_name, exception):\n        self.import_name = import_name\n        self.exception = exception\n\n        msg = (\n            'import_string() failed for %r. Possible reasons are:\\n\\n'\n            '- missing __init__.py in a package;\\n'\n            '- package or module path not included in sys.path;\\n'\n            '- duplicated package or module name taking precedence in '\n            'sys.path;\\n'\n            '- missing module, class, function or variable;\\n\\n'\n            'Debugged import:\\n\\n%s\\n\\n'\n            'Original exception:\\n\\n%s: %s')\n\n        name = ''\n        tracked = []\n        for part in import_name.replace(':', '.').split('.'):\n            name += (name and '.') + part\n            imported = import_string(name, silent=True)\n            if imported:\n                tracked.append((name, getattr(imported, '__file__', None)))\n            else:\n                track = ['- %r found in %r.' % (n, i) for n, i in tracked]\n                track.append('- %r not found.' % name)\n                msg = msg % (import_name, '\\n'.join(track),\n                             exception.__class__.__name__, str(exception))\n                break\n\n        ImportError.__init__(self, msg)\n\n    def __repr__(self):\n        return '<%s(%r, %r)>' % (self.__class__.__name__, self.import_name,\n                                 self.exception)\n\n\n# DEPRECATED\n# these objects were previously in this module as well.  we import\n# them here for backwards compatibility with old pickles.\nfrom werkzeug.datastructures import (  # noqa\n    MultiDict, CombinedMultiDict, Headers, EnvironHeaders)\nfrom werkzeug.http import parse_cookie, dump_cookie  # noqa\n"
  },
  {
    "path": "lib/werkzeug/wrappers.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    werkzeug.wrappers\n    ~~~~~~~~~~~~~~~~~\n\n    The wrappers are simple request and response objects which you can\n    subclass to do whatever you want them to do.  The request object contains\n    the information transmitted by the client (webbrowser) and the response\n    object contains all the information sent back to the browser.\n\n    An important detail is that the request object is created with the WSGI\n    environ and will act as high-level proxy whereas the response object is an\n    actual WSGI application.\n\n    Like everything else in Werkzeug these objects will work correctly with\n    unicode data.  Incoming form data parsed by the response object will be\n    decoded into an unicode object if possible and if it makes sense.\n\n\n    :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nfrom functools import update_wrapper\nfrom datetime import datetime, timedelta\n\nfrom werkzeug.http import HTTP_STATUS_CODES, \\\n    parse_accept_header, parse_cache_control_header, parse_etags, \\\n    parse_date, generate_etag, is_resource_modified, unquote_etag, \\\n    quote_etag, parse_set_header, parse_authorization_header, \\\n    parse_www_authenticate_header, remove_entity_headers, \\\n    parse_options_header, dump_options_header, http_date, \\\n    parse_if_range_header, parse_cookie, dump_cookie, \\\n    parse_range_header, parse_content_range_header, dump_header\nfrom werkzeug.urls import url_decode, iri_to_uri, url_join\nfrom werkzeug.formparser import FormDataParser, default_stream_factory\nfrom werkzeug.utils import cached_property, environ_property, \\\n    header_property, get_content_type\nfrom werkzeug.wsgi import get_current_url, get_host, \\\n    ClosingIterator, get_input_stream, get_content_length\nfrom werkzeug.datastructures import MultiDict, CombinedMultiDict, Headers, \\\n    EnvironHeaders, ImmutableMultiDict, ImmutableTypeConversionDict, \\\n    ImmutableList, MIMEAccept, CharsetAccept, LanguageAccept, \\\n    ResponseCacheControl, RequestCacheControl, CallbackDict, \\\n    ContentRange, iter_multi_items\nfrom werkzeug._internal import _get_environ\nfrom werkzeug._compat import to_bytes, string_types, text_type, \\\n    integer_types, wsgi_decoding_dance, wsgi_get_bytes, \\\n    to_unicode, to_native, BytesIO\n\n\ndef _run_wsgi_app(*args):\n    \"\"\"This function replaces itself to ensure that the test module is not\n    imported unless required.  DO NOT USE!\n    \"\"\"\n    global _run_wsgi_app\n    from werkzeug.test import run_wsgi_app as _run_wsgi_app\n    return _run_wsgi_app(*args)\n\n\ndef _warn_if_string(iterable):\n    \"\"\"Helper for the response objects to check if the iterable returned\n    to the WSGI server is not a string.\n    \"\"\"\n    if isinstance(iterable, string_types):\n        from warnings import warn\n        warn(Warning('response iterable was set to a string.  This appears '\n                     'to work but means that the server will send the '\n                     'data to the client char, by char.  This is almost '\n                     'never intended behavior, use response.data to assign '\n                     'strings to the response object.'), stacklevel=2)\n\n\ndef _assert_not_shallow(request):\n    if request.shallow:\n        raise RuntimeError('A shallow request tried to consume '\n                           'form data.  If you really want to do '\n                           'that, set `shallow` to False.')\n\n\ndef _iter_encoded(iterable, charset):\n    for item in iterable:\n        if isinstance(item, text_type):\n            yield item.encode(charset)\n        else:\n            yield item\n\n\nclass BaseRequest(object):\n\n    \"\"\"Very basic request object.  This does not implement advanced stuff like\n    entity tag parsing or cache controls.  The request object is created with\n    the WSGI environment as first argument and will add itself to the WSGI\n    environment as ``'werkzeug.request'`` unless it's created with\n    `populate_request` set to False.\n\n    There are a couple of mixins available that add additional functionality\n    to the request object, there is also a class called `Request` which\n    subclasses `BaseRequest` and all the important mixins.\n\n    It's a good idea to create a custom subclass of the :class:`BaseRequest`\n    and add missing functionality either via mixins or direct implementation.\n    Here an example for such subclasses::\n\n        from werkzeug.wrappers import BaseRequest, ETagRequestMixin\n\n        class Request(BaseRequest, ETagRequestMixin):\n            pass\n\n    Request objects are **read only**.  As of 0.5 modifications are not\n    allowed in any place.  Unlike the lower level parsing functions the\n    request object will use immutable objects everywhere possible.\n\n    Per default the request object will assume all the text data is `utf-8`\n    encoded.  Please refer to `the unicode chapter <unicode.txt>`_ for more\n    details about customizing the behavior.\n\n    Per default the request object will be added to the WSGI\n    environment as `werkzeug.request` to support the debugging system.\n    If you don't want that, set `populate_request` to `False`.\n\n    If `shallow` is `True` the environment is initialized as shallow\n    object around the environ.  Every operation that would modify the\n    environ in any way (such as consuming form data) raises an exception\n    unless the `shallow` attribute is explicitly set to `False`.  This\n    is useful for middlewares where you don't want to consume the form\n    data by accident.  A shallow request is not populated to the WSGI\n    environment.\n\n    .. versionchanged:: 0.5\n       read-only mode was enforced by using immutables classes for all\n       data.\n    \"\"\"\n\n    #: the charset for the request, defaults to utf-8\n    charset = 'utf-8'\n\n    #: the error handling procedure for errors, defaults to 'replace'\n    encoding_errors = 'replace'\n\n    #: the maximum content length.  This is forwarded to the form data\n    #: parsing function (:func:`parse_form_data`).  When set and the\n    #: :attr:`form` or :attr:`files` attribute is accessed and the\n    #: parsing fails because more than the specified value is transmitted\n    #: a :exc:`~werkzeug.exceptions.RequestEntityTooLarge` exception is raised.\n    #:\n    #: Have a look at :ref:`dealing-with-request-data` for more details.\n    #:\n    #: .. versionadded:: 0.5\n    max_content_length = None\n\n    #: the maximum form field size.  This is forwarded to the form data\n    #: parsing function (:func:`parse_form_data`).  When set and the\n    #: :attr:`form` or :attr:`files` attribute is accessed and the\n    #: data in memory for post data is longer than the specified value a\n    #: :exc:`~werkzeug.exceptions.RequestEntityTooLarge` exception is raised.\n    #:\n    #: Have a look at :ref:`dealing-with-request-data` for more details.\n    #:\n    #: .. versionadded:: 0.5\n    max_form_memory_size = None\n\n    #: the class to use for `args` and `form`.  The default is an\n    #: :class:`~werkzeug.datastructures.ImmutableMultiDict` which supports\n    #: multiple values per key.  alternatively it makes sense to use an\n    #: :class:`~werkzeug.datastructures.ImmutableOrderedMultiDict` which\n    #: preserves order or a :class:`~werkzeug.datastructures.ImmutableDict`\n    #: which is the fastest but only remembers the last key.  It is also\n    #: possible to use mutable structures, but this is not recommended.\n    #:\n    #: .. versionadded:: 0.6\n    parameter_storage_class = ImmutableMultiDict\n\n    #: the type to be used for list values from the incoming WSGI environment.\n    #: By default an :class:`~werkzeug.datastructures.ImmutableList` is used\n    #: (for example for :attr:`access_list`).\n    #:\n    #: .. versionadded:: 0.6\n    list_storage_class = ImmutableList\n\n    #: the type to be used for dict values from the incoming WSGI environment.\n    #: By default an\n    #: :class:`~werkzeug.datastructures.ImmutableTypeConversionDict` is used\n    #: (for example for :attr:`cookies`).\n    #:\n    #: .. versionadded:: 0.6\n    dict_storage_class = ImmutableTypeConversionDict\n\n    #: The form data parser that shoud be used.  Can be replaced to customize\n    #: the form date parsing.\n    form_data_parser_class = FormDataParser\n\n    #: Optionally a list of hosts that is trusted by this request.  By default\n    #: all hosts are trusted which means that whatever the client sends the\n    #: host is will be accepted.\n    #:\n    #: This is the recommended setup as a webserver should manually be set up\n    #: to only route correct hosts to the application, and remove the\n    #: `X-Forwarded-Host` header if it is not being used (see\n    #: :func:`werkzeug.wsgi.get_host`).\n    #:\n    #: .. versionadded:: 0.9\n    trusted_hosts = None\n\n    #: Indicates whether the data descriptor should be allowed to read and\n    #: buffer up the input stream.  By default it's enabled.\n    #:\n    #: .. versionadded:: 0.9\n    disable_data_descriptor = False\n\n    def __init__(self, environ, populate_request=True, shallow=False):\n        self.environ = environ\n        if populate_request and not shallow:\n            self.environ['werkzeug.request'] = self\n        self.shallow = shallow\n\n    def __repr__(self):\n        # make sure the __repr__ even works if the request was created\n        # from an invalid WSGI environment.  If we display the request\n        # in a debug session we don't want the repr to blow up.\n        args = []\n        try:\n            args.append(\"'%s'\" % to_native(self.url, self.url_charset))\n            args.append('[%s]' % self.method)\n        except Exception:\n            args.append('(invalid WSGI environ)')\n\n        return '<%s %s>' % (\n            self.__class__.__name__,\n            ' '.join(args)\n        )\n\n    @property\n    def url_charset(self):\n        \"\"\"The charset that is assumed for URLs.  Defaults to the value\n        of :attr:`charset`.\n\n        .. versionadded:: 0.6\n        \"\"\"\n        return self.charset\n\n    @classmethod\n    def from_values(cls, *args, **kwargs):\n        \"\"\"Create a new request object based on the values provided.  If\n        environ is given missing values are filled from there.  This method is\n        useful for small scripts when you need to simulate a request from an URL.\n        Do not use this method for unittesting, there is a full featured client\n        object (:class:`Client`) that allows to create multipart requests,\n        support for cookies etc.\n\n        This accepts the same options as the\n        :class:`~werkzeug.test.EnvironBuilder`.\n\n        .. versionchanged:: 0.5\n           This method now accepts the same arguments as\n           :class:`~werkzeug.test.EnvironBuilder`.  Because of this the\n           `environ` parameter is now called `environ_overrides`.\n\n        :return: request object\n        \"\"\"\n        from werkzeug.test import EnvironBuilder\n        charset = kwargs.pop('charset', cls.charset)\n        kwargs['charset'] = charset\n        builder = EnvironBuilder(*args, **kwargs)\n        try:\n            return builder.get_request(cls)\n        finally:\n            builder.close()\n\n    @classmethod\n    def application(cls, f):\n        \"\"\"Decorate a function as responder that accepts the request as first\n        argument.  This works like the :func:`responder` decorator but the\n        function is passed the request object as first argument and the\n        request object will be closed automatically::\n\n            @Request.application\n            def my_wsgi_app(request):\n                return Response('Hello World!')\n\n        :param f: the WSGI callable to decorate\n        :return: a new WSGI callable\n        \"\"\"\n        #: return a callable that wraps the -2nd argument with the request\n        #: and calls the function with all the arguments up to that one and\n        #: the request.  The return value is then called with the latest\n        #: two arguments.  This makes it possible to use this decorator for\n        #: both methods and standalone WSGI functions.\n        def application(*args):\n            request = cls(args[-2])\n            with request:\n                return f(*args[:-2] + (request,))(*args[-2:])\n        return update_wrapper(application, f)\n\n    def _get_file_stream(self, total_content_length, content_type, filename=None,\n                         content_length=None):\n        \"\"\"Called to get a stream for the file upload.\n\n        This must provide a file-like class with `read()`, `readline()`\n        and `seek()` methods that is both writeable and readable.\n\n        The default implementation returns a temporary file if the total\n        content length is higher than 500KB.  Because many browsers do not\n        provide a content length for the files only the total content\n        length matters.\n\n        :param total_content_length: the total content length of all the\n                                     data in the request combined.  This value\n                                     is guaranteed to be there.\n        :param content_type: the mimetype of the uploaded file.\n        :param filename: the filename of the uploaded file.  May be `None`.\n        :param content_length: the length of this file.  This value is usually\n                               not provided because webbrowsers do not provide\n                               this value.\n        \"\"\"\n        return default_stream_factory(total_content_length, content_type,\n                                      filename, content_length)\n\n    @property\n    def want_form_data_parsed(self):\n        \"\"\"Returns True if the request method carries content.  As of\n        Werkzeug 0.9 this will be the case if a content type is transmitted.\n\n        .. versionadded:: 0.8\n        \"\"\"\n        return bool(self.environ.get('CONTENT_TYPE'))\n\n    def make_form_data_parser(self):\n        \"\"\"Creates the form data parser.  Instanciates the\n        :attr:`form_data_parser_class` with some parameters.\n\n        .. versionadded:: 0.8\n        \"\"\"\n        return self.form_data_parser_class(self._get_file_stream,\n                                           self.charset,\n                                           self.encoding_errors,\n                                           self.max_form_memory_size,\n                                           self.max_content_length,\n                                           self.parameter_storage_class)\n\n    def _load_form_data(self):\n        \"\"\"Method used internally to retrieve submitted data.  After calling\n        this sets `form` and `files` on the request object to multi dicts\n        filled with the incoming form data.  As a matter of fact the input\n        stream will be empty afterwards.  You can also call this method to\n        force the parsing of the form data.\n\n        .. versionadded:: 0.8\n        \"\"\"\n        # abort early if we have already consumed the stream\n        if 'form' in self.__dict__:\n            return\n\n        _assert_not_shallow(self)\n\n        if self.want_form_data_parsed:\n            content_type = self.environ.get('CONTENT_TYPE', '')\n            content_length = get_content_length(self.environ)\n            mimetype, options = parse_options_header(content_type)\n            parser = self.make_form_data_parser()\n            data = parser.parse(self._get_stream_for_parsing(),\n                                mimetype, content_length, options)\n        else:\n            data = (self.stream, self.parameter_storage_class(),\n                    self.parameter_storage_class())\n\n        # inject the values into the instance dict so that we bypass\n        # our cached_property non-data descriptor.\n        d = self.__dict__\n        d['stream'], d['form'], d['files'] = data\n\n    def _get_stream_for_parsing(self):\n        \"\"\"This is the same as accessing :attr:`stream` with the difference\n        that if it finds cached data from calling :meth:`get_data` first it\n        will create a new stream out of the cached data.\n\n        .. versionadded:: 0.9.3\n        \"\"\"\n        cached_data = getattr(self, '_cached_data', None)\n        if cached_data is not None:\n            return BytesIO(cached_data)\n        return self.stream\n\n    def close(self):\n        \"\"\"Closes associated resources of this request object.  This\n        closes all file handles explicitly.  You can also use the request\n        object in a with statement which will automatically close it.\n\n        .. versionadded:: 0.9\n        \"\"\"\n        files = self.__dict__.get('files')\n        for key, value in iter_multi_items(files or ()):\n            value.close()\n\n    def __enter__(self):\n        return self\n\n    def __exit__(self, exc_type, exc_value, tb):\n        self.close()\n\n    @cached_property\n    def stream(self):\n        \"\"\"The stream to read incoming data from.  Unlike :attr:`input_stream`\n        this stream is properly guarded that you can't accidentally read past\n        the length of the input.  Werkzeug will internally always refer to\n        this stream to read data which makes it possible to wrap this\n        object with a stream that does filtering.\n\n        .. versionchanged:: 0.9\n           This stream is now always available but might be consumed by the\n           form parser later on.  Previously the stream was only set if no\n           parsing happened.\n        \"\"\"\n        _assert_not_shallow(self)\n        return get_input_stream(self.environ)\n\n    input_stream = environ_property('wsgi.input', \"\"\"\n    The WSGI input stream.\n\n    In general it's a bad idea to use this one because you can easily read past\n    the boundary.  Use the :attr:`stream` instead.\n    \"\"\")\n\n    @cached_property\n    def args(self):\n        \"\"\"The parsed URL parameters.  By default an\n        :class:`~werkzeug.datastructures.ImmutableMultiDict`\n        is returned from this function.  This can be changed by setting\n        :attr:`parameter_storage_class` to a different type.  This might\n        be necessary if the order of the form data is important.\n        \"\"\"\n        return url_decode(wsgi_get_bytes(self.environ.get('QUERY_STRING', '')),\n                          self.url_charset, errors=self.encoding_errors,\n                          cls=self.parameter_storage_class)\n\n    @cached_property\n    def data(self):\n        if self.disable_data_descriptor:\n            raise AttributeError('data descriptor is disabled')\n        # XXX: this should eventually be deprecated.\n\n        # We trigger form data parsing first which means that the descriptor\n        # will not cache the data that would otherwise be .form or .files\n        # data.  This restores the behavior that was there in Werkzeug\n        # before 0.9.  New code should use :meth:`get_data` explicitly as\n        # this will make behavior explicit.\n        return self.get_data(parse_form_data=True)\n\n    def get_data(self, cache=True, as_text=False, parse_form_data=False):\n        \"\"\"This reads the buffered incoming data from the client into one\n        bytestring.  By default this is cached but that behavior can be\n        changed by setting `cache` to `False`.\n\n        Usually it's a bad idea to call this method without checking the\n        content length first as a client could send dozens of megabytes or more\n        to cause memory problems on the server.\n\n        Note that if the form data was already parsed this method will not\n        return anything as form data parsing does not cache the data like\n        this method does.  To implicitly invoke form data parsing function\n        set `parse_form_data` to `True`.  When this is done the return value\n        of this method will be an empty string if the form parser handles\n        the data.  This generally is not necessary as if the whole data is\n        cached (which is the default) the form parser will used the cached\n        data to parse the form data.  Please be generally aware of checking\n        the content length first in any case before calling this method\n        to avoid exhausting server memory.\n\n        If `as_text` is set to `True` the return value will be a decoded\n        unicode string.\n\n        .. versionadded:: 0.9\n        \"\"\"\n        rv = getattr(self, '_cached_data', None)\n        if rv is None:\n            if parse_form_data:\n                self._load_form_data()\n            rv = self.stream.read()\n            if cache:\n                self._cached_data = rv\n        if as_text:\n            rv = rv.decode(self.charset, self.encoding_errors)\n        return rv\n\n    @cached_property\n    def form(self):\n        \"\"\"The form parameters.  By default an\n        :class:`~werkzeug.datastructures.ImmutableMultiDict`\n        is returned from this function.  This can be changed by setting\n        :attr:`parameter_storage_class` to a different type.  This might\n        be necessary if the order of the form data is important.\n        \"\"\"\n        self._load_form_data()\n        return self.form\n\n    @cached_property\n    def values(self):\n        \"\"\"Combined multi dict for :attr:`args` and :attr:`form`.\"\"\"\n        args = []\n        for d in self.args, self.form:\n            if not isinstance(d, MultiDict):\n                d = MultiDict(d)\n            args.append(d)\n        return CombinedMultiDict(args)\n\n    @cached_property\n    def files(self):\n        \"\"\":class:`~werkzeug.datastructures.MultiDict` object containing\n        all uploaded files.  Each key in :attr:`files` is the name from the\n        ``<input type=\"file\" name=\"\">``.  Each value in :attr:`files` is a\n        Werkzeug :class:`~werkzeug.datastructures.FileStorage` object.\n\n        Note that :attr:`files` will only contain data if the request method was\n        POST, PUT or PATCH and the ``<form>`` that posted to the request had\n        ``enctype=\"multipart/form-data\"``.  It will be empty otherwise.\n\n        See the :class:`~werkzeug.datastructures.MultiDict` /\n        :class:`~werkzeug.datastructures.FileStorage` documentation for\n        more details about the used data structure.\n        \"\"\"\n        self._load_form_data()\n        return self.files\n\n    @cached_property\n    def cookies(self):\n        \"\"\"Read only access to the retrieved cookie values as dictionary.\"\"\"\n        return parse_cookie(self.environ, self.charset,\n                            self.encoding_errors,\n                            cls=self.dict_storage_class)\n\n    @cached_property\n    def headers(self):\n        \"\"\"The headers from the WSGI environ as immutable\n        :class:`~werkzeug.datastructures.EnvironHeaders`.\n        \"\"\"\n        return EnvironHeaders(self.environ)\n\n    @cached_property\n    def path(self):\n        \"\"\"Requested path as unicode.  This works a bit like the regular path\n        info in the WSGI environment but will always include a leading slash,\n        even if the URL root is accessed.\n        \"\"\"\n        raw_path = wsgi_decoding_dance(self.environ.get('PATH_INFO') or '',\n                                       self.charset, self.encoding_errors)\n        return '/' + raw_path.lstrip('/')\n\n    @cached_property\n    def full_path(self):\n        \"\"\"Requested path as unicode, including the query string.\"\"\"\n        return self.path + u'?' + to_unicode(self.query_string, self.url_charset)\n\n    @cached_property\n    def script_root(self):\n        \"\"\"The root path of the script without the trailing slash.\"\"\"\n        raw_path = wsgi_decoding_dance(self.environ.get('SCRIPT_NAME') or '',\n                                       self.charset, self.encoding_errors)\n        return raw_path.rstrip('/')\n\n    @cached_property\n    def url(self):\n        \"\"\"The reconstructed current URL as IRI.\n        See also: :attr:`trusted_hosts`.\n        \"\"\"\n        return get_current_url(self.environ,\n                               trusted_hosts=self.trusted_hosts)\n\n    @cached_property\n    def base_url(self):\n        \"\"\"Like :attr:`url` but without the querystring\n        See also: :attr:`trusted_hosts`.\n        \"\"\"\n        return get_current_url(self.environ, strip_querystring=True,\n                               trusted_hosts=self.trusted_hosts)\n\n    @cached_property\n    def url_root(self):\n        \"\"\"The full URL root (with hostname), this is the application\n        root as IRI.\n        See also: :attr:`trusted_hosts`.\n        \"\"\"\n        return get_current_url(self.environ, True,\n                               trusted_hosts=self.trusted_hosts)\n\n    @cached_property\n    def host_url(self):\n        \"\"\"Just the host with scheme as IRI.\n        See also: :attr:`trusted_hosts`.\n        \"\"\"\n        return get_current_url(self.environ, host_only=True,\n                               trusted_hosts=self.trusted_hosts)\n\n    @cached_property\n    def host(self):\n        \"\"\"Just the host including the port if available.\n        See also: :attr:`trusted_hosts`.\n        \"\"\"\n        return get_host(self.environ, trusted_hosts=self.trusted_hosts)\n\n    query_string = environ_property(\n        'QUERY_STRING', '', read_only=True,\n        load_func=wsgi_get_bytes, doc='The URL parameters as raw bytestring.')\n    method = environ_property(\n        'REQUEST_METHOD', 'GET', read_only=True,\n        load_func=lambda x: x.upper(),\n        doc=\"The transmission method. (For example ``'GET'`` or ``'POST'``).\")\n\n    @cached_property\n    def access_route(self):\n        \"\"\"If a forwarded header exists this is a list of all ip addresses\n        from the client ip to the last proxy server.\n        \"\"\"\n        if 'HTTP_X_FORWARDED_FOR' in self.environ:\n            addr = self.environ['HTTP_X_FORWARDED_FOR'].split(',')\n            return self.list_storage_class([x.strip() for x in addr])\n        elif 'REMOTE_ADDR' in self.environ:\n            return self.list_storage_class([self.environ['REMOTE_ADDR']])\n        return self.list_storage_class()\n\n    @property\n    def remote_addr(self):\n        \"\"\"The remote address of the client.\"\"\"\n        return self.environ.get('REMOTE_ADDR')\n\n    remote_user = environ_property('REMOTE_USER', doc='''\n        If the server supports user authentication, and the script is\n        protected, this attribute contains the username the user has\n        authenticated as.''')\n\n    scheme = environ_property('wsgi.url_scheme', doc='''\n        URL scheme (http or https).\n\n        .. versionadded:: 0.7''')\n\n    is_xhr = property(lambda x: x.environ.get('HTTP_X_REQUESTED_WITH', '')\n                      .lower() == 'xmlhttprequest', doc='''\n        True if the request was triggered via a JavaScript XMLHttpRequest.\n        This only works with libraries that support the `X-Requested-With`\n        header and set it to \"XMLHttpRequest\".  Libraries that do that are\n        prototype, jQuery and Mochikit and probably some more.''')\n    is_secure = property(lambda x: x.environ['wsgi.url_scheme'] == 'https',\n                         doc='`True` if the request is secure.')\n    is_multithread = environ_property('wsgi.multithread', doc='''\n        boolean that is `True` if the application is served by\n        a multithreaded WSGI server.''')\n    is_multiprocess = environ_property('wsgi.multiprocess', doc='''\n        boolean that is `True` if the application is served by\n        a WSGI server that spawns multiple processes.''')\n    is_run_once = environ_property('wsgi.run_once', doc='''\n        boolean that is `True` if the application will be executed only\n        once in a process lifetime.  This is the case for CGI for example,\n        but it's not guaranteed that the execution only happens one time.''')\n\n\nclass BaseResponse(object):\n\n    \"\"\"Base response class.  The most important fact about a response object\n    is that it's a regular WSGI application.  It's initialized with a couple\n    of response parameters (headers, body, status code etc.) and will start a\n    valid WSGI response when called with the environ and start response\n    callable.\n\n    Because it's a WSGI application itself processing usually ends before the\n    actual response is sent to the server.  This helps debugging systems\n    because they can catch all the exceptions before responses are started.\n\n    Here a small example WSGI application that takes advantage of the\n    response objects::\n\n        from werkzeug.wrappers import BaseResponse as Response\n\n        def index():\n            return Response('Index page')\n\n        def application(environ, start_response):\n            path = environ.get('PATH_INFO') or '/'\n            if path == '/':\n                response = index()\n            else:\n                response = Response('Not Found', status=404)\n            return response(environ, start_response)\n\n    Like :class:`BaseRequest` which object is lacking a lot of functionality\n    implemented in mixins.  This gives you a better control about the actual\n    API of your response objects, so you can create subclasses and add custom\n    functionality.  A full featured response object is available as\n    :class:`Response` which implements a couple of useful mixins.\n\n    To enforce a new type of already existing responses you can use the\n    :meth:`force_type` method.  This is useful if you're working with different\n    subclasses of response objects and you want to post process them with a\n    known interface.\n\n    Per default the request object will assume all the text data is `utf-8`\n    encoded.  Please refer to `the unicode chapter <unicode.txt>`_ for more\n    details about customizing the behavior.\n\n    Response can be any kind of iterable or string.  If it's a string it's\n    considered being an iterable with one item which is the string passed.\n    Headers can be a list of tuples or a\n    :class:`~werkzeug.datastructures.Headers` object.\n\n    Special note for `mimetype` and `content_type`:  For most mime types\n    `mimetype` and `content_type` work the same, the difference affects\n    only 'text' mimetypes.  If the mimetype passed with `mimetype` is a\n    mimetype starting with `text/`, the charset parameter of the response\n    object is appended to it.  In contrast the `content_type` parameter is\n    always added as header unmodified.\n\n    .. versionchanged:: 0.5\n       the `direct_passthrough` parameter was added.\n\n    :param response: a string or response iterable.\n    :param status: a string with a status or an integer with the status code.\n    :param headers: a list of headers or a\n                    :class:`~werkzeug.datastructures.Headers` object.\n    :param mimetype: the mimetype for the request.  See notice above.\n    :param content_type: the content type for the request.  See notice above.\n    :param direct_passthrough: if set to `True` :meth:`iter_encoded` is not\n                               called before iteration which makes it\n                               possible to pass special iterators through\n                               unchanged (see :func:`wrap_file` for more\n                               details.)\n    \"\"\"\n\n    #: the charset of the response.\n    charset = 'utf-8'\n\n    #: the default status if none is provided.\n    default_status = 200\n\n    #: the default mimetype if none is provided.\n    default_mimetype = 'text/plain'\n\n    #: if set to `False` accessing properties on the response object will\n    #: not try to consume the response iterator and convert it into a list.\n    #:\n    #: .. versionadded:: 0.6.2\n    #:\n    #:    That attribute was previously called `implicit_seqence_conversion`.\n    #:    (Notice the typo).  If you did use this feature, you have to adapt\n    #:    your code to the name change.\n    implicit_sequence_conversion = True\n\n    #: Should this response object correct the location header to be RFC\n    #: conformant?  This is true by default.\n    #:\n    #: .. versionadded:: 0.8\n    autocorrect_location_header = True\n\n    #: Should this response object automatically set the content-length\n    #: header if possible?  This is true by default.\n    #:\n    #: .. versionadded:: 0.8\n    automatically_set_content_length = True\n\n    def __init__(self, response=None, status=None, headers=None,\n                 mimetype=None, content_type=None, direct_passthrough=False):\n        if isinstance(headers, Headers):\n            self.headers = headers\n        elif not headers:\n            self.headers = Headers()\n        else:\n            self.headers = Headers(headers)\n\n        if content_type is None:\n            if mimetype is None and 'content-type' not in self.headers:\n                mimetype = self.default_mimetype\n            if mimetype is not None:\n                mimetype = get_content_type(mimetype, self.charset)\n            content_type = mimetype\n        if content_type is not None:\n            self.headers['Content-Type'] = content_type\n        if status is None:\n            status = self.default_status\n        if isinstance(status, integer_types):\n            self.status_code = status\n        else:\n            self.status = status\n\n        self.direct_passthrough = direct_passthrough\n        self._on_close = []\n\n        # we set the response after the headers so that if a class changes\n        # the charset attribute, the data is set in the correct charset.\n        if response is None:\n            self.response = []\n        elif isinstance(response, (text_type, bytes, bytearray)):\n            self.set_data(response)\n        else:\n            self.response = response\n\n    def call_on_close(self, func):\n        \"\"\"Adds a function to the internal list of functions that should\n        be called as part of closing down the response.  Since 0.7 this\n        function also returns the function that was passed so that this\n        can be used as a decorator.\n\n        .. versionadded:: 0.6\n        \"\"\"\n        self._on_close.append(func)\n        return func\n\n    def __repr__(self):\n        if self.is_sequence:\n            body_info = '%d bytes' % sum(map(len, self.iter_encoded()))\n        else:\n            body_info = 'streamed' if self.is_streamed else 'likely-streamed'\n        return '<%s %s [%s]>' % (\n            self.__class__.__name__,\n            body_info,\n            self.status\n        )\n\n    @classmethod\n    def force_type(cls, response, environ=None):\n        \"\"\"Enforce that the WSGI response is a response object of the current\n        type.  Werkzeug will use the :class:`BaseResponse` internally in many\n        situations like the exceptions.  If you call :meth:`get_response` on an\n        exception you will get back a regular :class:`BaseResponse` object, even\n        if you are using a custom subclass.\n\n        This method can enforce a given response type, and it will also\n        convert arbitrary WSGI callables into response objects if an environ\n        is provided::\n\n            # convert a Werkzeug response object into an instance of the\n            # MyResponseClass subclass.\n            response = MyResponseClass.force_type(response)\n\n            # convert any WSGI application into a response object\n            response = MyResponseClass.force_type(response, environ)\n\n        This is especially useful if you want to post-process responses in\n        the main dispatcher and use functionality provided by your subclass.\n\n        Keep in mind that this will modify response objects in place if\n        possible!\n\n        :param response: a response object or wsgi application.\n        :param environ: a WSGI environment object.\n        :return: a response object.\n        \"\"\"\n        if not isinstance(response, BaseResponse):\n            if environ is None:\n                raise TypeError('cannot convert WSGI application into '\n                                'response objects without an environ')\n            response = BaseResponse(*_run_wsgi_app(response, environ))\n        response.__class__ = cls\n        return response\n\n    @classmethod\n    def from_app(cls, app, environ, buffered=False):\n        \"\"\"Create a new response object from an application output.  This\n        works best if you pass it an application that returns a generator all\n        the time.  Sometimes applications may use the `write()` callable\n        returned by the `start_response` function.  This tries to resolve such\n        edge cases automatically.  But if you don't get the expected output\n        you should set `buffered` to `True` which enforces buffering.\n\n        :param app: the WSGI application to execute.\n        :param environ: the WSGI environment to execute against.\n        :param buffered: set to `True` to enforce buffering.\n        :return: a response object.\n        \"\"\"\n        return cls(*_run_wsgi_app(app, environ, buffered))\n\n    def _get_status_code(self):\n        return self._status_code\n\n    def _set_status_code(self, code):\n        self._status_code = code\n        try:\n            self._status = '%d %s' % (code, HTTP_STATUS_CODES[code].upper())\n        except KeyError:\n            self._status = '%d UNKNOWN' % code\n    status_code = property(_get_status_code, _set_status_code,\n                           doc='The HTTP Status code as number')\n    del _get_status_code, _set_status_code\n\n    def _get_status(self):\n        return self._status\n\n    def _set_status(self, value):\n        self._status = to_native(value)\n        try:\n            self._status_code = int(self._status.split(None, 1)[0])\n        except ValueError:\n            self._status_code = 0\n            self._status = '0 %s' % self._status\n    status = property(_get_status, _set_status, doc='The HTTP Status code')\n    del _get_status, _set_status\n\n    def get_data(self, as_text=False):\n        \"\"\"The string representation of the request body.  Whenever you call\n        this property the request iterable is encoded and flattened.  This\n        can lead to unwanted behavior if you stream big data.\n\n        This behavior can be disabled by setting\n        :attr:`implicit_sequence_conversion` to `False`.\n\n        If `as_text` is set to `True` the return value will be a decoded\n        unicode string.\n\n        .. versionadded:: 0.9\n        \"\"\"\n        self._ensure_sequence()\n        rv = b''.join(self.iter_encoded())\n        if as_text:\n            rv = rv.decode(self.charset)\n        return rv\n\n    def set_data(self, value):\n        \"\"\"Sets a new string as response.  The value set must either by a\n        unicode or bytestring.  If a unicode string is set it's encoded\n        automatically to the charset of the response (utf-8 by default).\n\n        .. versionadded:: 0.9\n        \"\"\"\n        # if an unicode string is set, it's encoded directly so that we\n        # can set the content length\n        if isinstance(value, text_type):\n            value = value.encode(self.charset)\n        else:\n            value = bytes(value)\n        self.response = [value]\n        if self.automatically_set_content_length:\n            self.headers['Content-Length'] = str(len(value))\n\n    data = property(get_data, set_data, doc='''\n        A descriptor that calls :meth:`get_data` and :meth:`set_data`.  This\n        should not be used and will eventually get deprecated.\n        ''')\n\n    def calculate_content_length(self):\n        \"\"\"Returns the content length if available or `None` otherwise.\"\"\"\n        try:\n            self._ensure_sequence()\n        except RuntimeError:\n            return None\n        return sum(len(x) for x in self.response)\n\n    def _ensure_sequence(self, mutable=False):\n        \"\"\"This method can be called by methods that need a sequence.  If\n        `mutable` is true, it will also ensure that the response sequence\n        is a standard Python list.\n\n        .. versionadded:: 0.6\n        \"\"\"\n        if self.is_sequence:\n            # if we need a mutable object, we ensure it's a list.\n            if mutable and not isinstance(self.response, list):\n                self.response = list(self.response)\n            return\n        if self.direct_passthrough:\n            raise RuntimeError('Attempted implicit sequence conversion '\n                               'but the response object is in direct '\n                               'passthrough mode.')\n        if not self.implicit_sequence_conversion:\n            raise RuntimeError('The response object required the iterable '\n                               'to be a sequence, but the implicit '\n                               'conversion was disabled.  Call '\n                               'make_sequence() yourself.')\n        self.make_sequence()\n\n    def make_sequence(self):\n        \"\"\"Converts the response iterator in a list.  By default this happens\n        automatically if required.  If `implicit_sequence_conversion` is\n        disabled, this method is not automatically called and some properties\n        might raise exceptions.  This also encodes all the items.\n\n        .. versionadded:: 0.6\n        \"\"\"\n        if not self.is_sequence:\n            # if we consume an iterable we have to ensure that the close\n            # method of the iterable is called if available when we tear\n            # down the response\n            close = getattr(self.response, 'close', None)\n            self.response = list(self.iter_encoded())\n            if close is not None:\n                self.call_on_close(close)\n\n    def iter_encoded(self):\n        \"\"\"Iter the response encoded with the encoding of the response.\n        If the response object is invoked as WSGI application the return\n        value of this method is used as application iterator unless\n        :attr:`direct_passthrough` was activated.\n        \"\"\"\n        if __debug__:\n            _warn_if_string(self.response)\n        # Encode in a separate function so that self.response is fetched\n        # early.  This allows us to wrap the response with the return\n        # value from get_app_iter or iter_encoded.\n        return _iter_encoded(self.response, self.charset)\n\n    def set_cookie(self, key, value='', max_age=None, expires=None,\n                   path='/', domain=None, secure=None, httponly=False):\n        \"\"\"Sets a cookie. The parameters are the same as in the cookie `Morsel`\n        object in the Python standard library but it accepts unicode data, too.\n\n        :param key: the key (name) of the cookie to be set.\n        :param value: the value of the cookie.\n        :param max_age: should be a number of seconds, or `None` (default) if\n                        the cookie should last only as long as the client's\n                        browser session.\n        :param expires: should be a `datetime` object or UNIX timestamp.\n        :param domain: if you want to set a cross-domain cookie.  For example,\n                       ``domain=\".example.com\"`` will set a cookie that is\n                       readable by the domain ``www.example.com``,\n                       ``foo.example.com`` etc.  Otherwise, a cookie will only\n                       be readable by the domain that set it.\n        :param path: limits the cookie to a given path, per default it will\n                     span the whole domain.\n        \"\"\"\n        self.headers.add('Set-Cookie', dump_cookie(key, value, max_age,\n                                                   expires, path, domain, secure, httponly,\n                                                   self.charset))\n\n    def delete_cookie(self, key, path='/', domain=None):\n        \"\"\"Delete a cookie.  Fails silently if key doesn't exist.\n\n        :param key: the key (name) of the cookie to be deleted.\n        :param path: if the cookie that should be deleted was limited to a\n                     path, the path has to be defined here.\n        :param domain: if the cookie that should be deleted was limited to a\n                       domain, that domain has to be defined here.\n        \"\"\"\n        self.set_cookie(key, expires=0, max_age=0, path=path, domain=domain)\n\n    @property\n    def is_streamed(self):\n        \"\"\"If the response is streamed (the response is not an iterable with\n        a length information) this property is `True`.  In this case streamed\n        means that there is no information about the number of iterations.\n        This is usually `True` if a generator is passed to the response object.\n\n        This is useful for checking before applying some sort of post\n        filtering that should not take place for streamed responses.\n        \"\"\"\n        try:\n            len(self.response)\n        except (TypeError, AttributeError):\n            return True\n        return False\n\n    @property\n    def is_sequence(self):\n        \"\"\"If the iterator is buffered, this property will be `True`.  A\n        response object will consider an iterator to be buffered if the\n        response attribute is a list or tuple.\n\n        .. versionadded:: 0.6\n        \"\"\"\n        return isinstance(self.response, (tuple, list))\n\n    def close(self):\n        \"\"\"Close the wrapped response if possible.  You can also use the object\n        in a with statement which will automatically close it.\n\n        .. versionadded:: 0.9\n           Can now be used in a with statement.\n        \"\"\"\n        if hasattr(self.response, 'close'):\n            self.response.close()\n        for func in self._on_close:\n            func()\n\n    def __enter__(self):\n        return self\n\n    def __exit__(self, exc_type, exc_value, tb):\n        self.close()\n\n    def freeze(self):\n        \"\"\"Call this method if you want to make your response object ready for\n        being pickled.  This buffers the generator if there is one.  It will\n        also set the `Content-Length` header to the length of the body.\n\n        .. versionchanged:: 0.6\n           The `Content-Length` header is now set.\n        \"\"\"\n        # we explicitly set the length to a list of the *encoded* response\n        # iterator.  Even if the implicit sequence conversion is disabled.\n        self.response = list(self.iter_encoded())\n        self.headers['Content-Length'] = str(sum(map(len, self.response)))\n\n    def get_wsgi_headers(self, environ):\n        \"\"\"This is automatically called right before the response is started\n        and returns headers modified for the given environment.  It returns a\n        copy of the headers from the response with some modifications applied\n        if necessary.\n\n        For example the location header (if present) is joined with the root\n        URL of the environment.  Also the content length is automatically set\n        to zero here for certain status codes.\n\n        .. versionchanged:: 0.6\n           Previously that function was called `fix_headers` and modified\n           the response object in place.  Also since 0.6, IRIs in location\n           and content-location headers are handled properly.\n\n           Also starting with 0.6, Werkzeug will attempt to set the content\n           length if it is able to figure it out on its own.  This is the\n           case if all the strings in the response iterable are already\n           encoded and the iterable is buffered.\n\n        :param environ: the WSGI environment of the request.\n        :return: returns a new :class:`~werkzeug.datastructures.Headers`\n                 object.\n        \"\"\"\n        headers = Headers(self.headers)\n        location = None\n        content_location = None\n        content_length = None\n        status = self.status_code\n\n        # iterate over the headers to find all values in one go.  Because\n        # get_wsgi_headers is used each response that gives us a tiny\n        # speedup.\n        for key, value in headers:\n            ikey = key.lower()\n            if ikey == u'location':\n                location = value\n            elif ikey == u'content-location':\n                content_location = value\n            elif ikey == u'content-length':\n                content_length = value\n\n        # make sure the location header is an absolute URL\n        if location is not None:\n            old_location = location\n            if isinstance(location, text_type):\n                # Safe conversion is necessary here as we might redirect\n                # to a broken URI scheme (for instance itms-services).\n                location = iri_to_uri(location, safe_conversion=True)\n\n            if self.autocorrect_location_header:\n                current_url = get_current_url(environ, root_only=True)\n                if isinstance(current_url, text_type):\n                    current_url = iri_to_uri(current_url)\n                location = url_join(current_url, location)\n            if location != old_location:\n                headers['Location'] = location\n\n        # make sure the content location is a URL\n        if content_location is not None and \\\n           isinstance(content_location, text_type):\n            headers['Content-Location'] = iri_to_uri(content_location)\n\n        # remove entity headers and set content length to zero if needed.\n        # Also update content_length accordingly so that the automatic\n        # content length detection does not trigger in the following\n        # code.\n        if 100 <= status < 200 or status == 204:\n            headers['Content-Length'] = content_length = u'0'\n        elif status == 304:\n            remove_entity_headers(headers)\n\n        # if we can determine the content length automatically, we\n        # should try to do that.  But only if this does not involve\n        # flattening the iterator or encoding of unicode strings in\n        # the response.  We however should not do that if we have a 304\n        # response.\n        if self.automatically_set_content_length and \\\n           self.is_sequence and content_length is None and status != 304:\n            try:\n                content_length = sum(len(to_bytes(x, 'ascii'))\n                                     for x in self.response)\n            except UnicodeError:\n                # aha, something non-bytestringy in there, too bad, we\n                # can't safely figure out the length of the response.\n                pass\n            else:\n                headers['Content-Length'] = str(content_length)\n\n        return headers\n\n    def get_app_iter(self, environ):\n        \"\"\"Returns the application iterator for the given environ.  Depending\n        on the request method and the current status code the return value\n        might be an empty response rather than the one from the response.\n\n        If the request method is `HEAD` or the status code is in a range\n        where the HTTP specification requires an empty response, an empty\n        iterable is returned.\n\n        .. versionadded:: 0.6\n\n        :param environ: the WSGI environment of the request.\n        :return: a response iterable.\n        \"\"\"\n        status = self.status_code\n        if environ['REQUEST_METHOD'] == 'HEAD' or \\\n           100 <= status < 200 or status in (204, 304):\n            iterable = ()\n        elif self.direct_passthrough:\n            if __debug__:\n                _warn_if_string(self.response)\n            return self.response\n        else:\n            iterable = self.iter_encoded()\n        return ClosingIterator(iterable, self.close)\n\n    def get_wsgi_response(self, environ):\n        \"\"\"Returns the final WSGI response as tuple.  The first item in\n        the tuple is the application iterator, the second the status and\n        the third the list of headers.  The response returned is created\n        specially for the given environment.  For example if the request\n        method in the WSGI environment is ``'HEAD'`` the response will\n        be empty and only the headers and status code will be present.\n\n        .. versionadded:: 0.6\n\n        :param environ: the WSGI environment of the request.\n        :return: an ``(app_iter, status, headers)`` tuple.\n        \"\"\"\n        headers = self.get_wsgi_headers(environ)\n        app_iter = self.get_app_iter(environ)\n        return app_iter, self.status, headers.to_wsgi_list()\n\n    def __call__(self, environ, start_response):\n        \"\"\"Process this response as WSGI application.\n\n        :param environ: the WSGI environment.\n        :param start_response: the response callable provided by the WSGI\n                               server.\n        :return: an application iterator\n        \"\"\"\n        app_iter, status, headers = self.get_wsgi_response(environ)\n        start_response(status, headers)\n        return app_iter\n\n\nclass AcceptMixin(object):\n\n    \"\"\"A mixin for classes with an :attr:`~BaseResponse.environ` attribute\n    to get all the HTTP accept headers as\n    :class:`~werkzeug.datastructures.Accept` objects (or subclasses\n    thereof).\n    \"\"\"\n\n    @cached_property\n    def accept_mimetypes(self):\n        \"\"\"List of mimetypes this client supports as\n        :class:`~werkzeug.datastructures.MIMEAccept` object.\n        \"\"\"\n        return parse_accept_header(self.environ.get('HTTP_ACCEPT'), MIMEAccept)\n\n    @cached_property\n    def accept_charsets(self):\n        \"\"\"List of charsets this client supports as\n        :class:`~werkzeug.datastructures.CharsetAccept` object.\n        \"\"\"\n        return parse_accept_header(self.environ.get('HTTP_ACCEPT_CHARSET'),\n                                   CharsetAccept)\n\n    @cached_property\n    def accept_encodings(self):\n        \"\"\"List of encodings this client accepts.  Encodings in a HTTP term\n        are compression encodings such as gzip.  For charsets have a look at\n        :attr:`accept_charset`.\n        \"\"\"\n        return parse_accept_header(self.environ.get('HTTP_ACCEPT_ENCODING'))\n\n    @cached_property\n    def accept_languages(self):\n        \"\"\"List of languages this client accepts as\n        :class:`~werkzeug.datastructures.LanguageAccept` object.\n\n        .. versionchanged 0.5\n           In previous versions this was a regular\n           :class:`~werkzeug.datastructures.Accept` object.\n        \"\"\"\n        return parse_accept_header(self.environ.get('HTTP_ACCEPT_LANGUAGE'),\n                                   LanguageAccept)\n\n\nclass ETagRequestMixin(object):\n\n    \"\"\"Add entity tag and cache descriptors to a request object or object with\n    a WSGI environment available as :attr:`~BaseRequest.environ`.  This not\n    only provides access to etags but also to the cache control header.\n    \"\"\"\n\n    @cached_property\n    def cache_control(self):\n        \"\"\"A :class:`~werkzeug.datastructures.RequestCacheControl` object\n        for the incoming cache control headers.\n        \"\"\"\n        cache_control = self.environ.get('HTTP_CACHE_CONTROL')\n        return parse_cache_control_header(cache_control, None,\n                                          RequestCacheControl)\n\n    @cached_property\n    def if_match(self):\n        \"\"\"An object containing all the etags in the `If-Match` header.\n\n        :rtype: :class:`~werkzeug.datastructures.ETags`\n        \"\"\"\n        return parse_etags(self.environ.get('HTTP_IF_MATCH'))\n\n    @cached_property\n    def if_none_match(self):\n        \"\"\"An object containing all the etags in the `If-None-Match` header.\n\n        :rtype: :class:`~werkzeug.datastructures.ETags`\n        \"\"\"\n        return parse_etags(self.environ.get('HTTP_IF_NONE_MATCH'))\n\n    @cached_property\n    def if_modified_since(self):\n        \"\"\"The parsed `If-Modified-Since` header as datetime object.\"\"\"\n        return parse_date(self.environ.get('HTTP_IF_MODIFIED_SINCE'))\n\n    @cached_property\n    def if_unmodified_since(self):\n        \"\"\"The parsed `If-Unmodified-Since` header as datetime object.\"\"\"\n        return parse_date(self.environ.get('HTTP_IF_UNMODIFIED_SINCE'))\n\n    @cached_property\n    def if_range(self):\n        \"\"\"The parsed `If-Range` header.\n\n        .. versionadded:: 0.7\n\n        :rtype: :class:`~werkzeug.datastructures.IfRange`\n        \"\"\"\n        return parse_if_range_header(self.environ.get('HTTP_IF_RANGE'))\n\n    @cached_property\n    def range(self):\n        \"\"\"The parsed `Range` header.\n\n        .. versionadded:: 0.7\n\n        :rtype: :class:`~werkzeug.datastructures.Range`\n        \"\"\"\n        return parse_range_header(self.environ.get('HTTP_RANGE'))\n\n\nclass UserAgentMixin(object):\n\n    \"\"\"Adds a `user_agent` attribute to the request object which contains the\n    parsed user agent of the browser that triggered the request as a\n    :class:`~werkzeug.useragents.UserAgent` object.\n    \"\"\"\n\n    @cached_property\n    def user_agent(self):\n        \"\"\"The current user agent.\"\"\"\n        from werkzeug.useragents import UserAgent\n        return UserAgent(self.environ)\n\n\nclass AuthorizationMixin(object):\n\n    \"\"\"Adds an :attr:`authorization` property that represents the parsed\n    value of the `Authorization` header as\n    :class:`~werkzeug.datastructures.Authorization` object.\n    \"\"\"\n\n    @cached_property\n    def authorization(self):\n        \"\"\"The `Authorization` object in parsed form.\"\"\"\n        header = self.environ.get('HTTP_AUTHORIZATION')\n        return parse_authorization_header(header)\n\n\nclass StreamOnlyMixin(object):\n\n    \"\"\"If mixed in before the request object this will change the bahavior\n    of it to disable handling of form parsing.  This disables the\n    :attr:`files`, :attr:`form` attributes and will just provide a\n    :attr:`stream` attribute that however is always available.\n\n    .. versionadded:: 0.9\n    \"\"\"\n\n    disable_data_descriptor = True\n    want_form_data_parsed = False\n\n\nclass ETagResponseMixin(object):\n\n    \"\"\"Adds extra functionality to a response object for etag and cache\n    handling.  This mixin requires an object with at least a `headers`\n    object that implements a dict like interface similar to\n    :class:`~werkzeug.datastructures.Headers`.\n\n    If you want the :meth:`freeze` method to automatically add an etag, you\n    have to mixin this method before the response base class.  The default\n    response class does not do that.\n    \"\"\"\n\n    @property\n    def cache_control(self):\n        \"\"\"The Cache-Control general-header field is used to specify\n        directives that MUST be obeyed by all caching mechanisms along the\n        request/response chain.\n        \"\"\"\n        def on_update(cache_control):\n            if not cache_control and 'cache-control' in self.headers:\n                del self.headers['cache-control']\n            elif cache_control:\n                self.headers['Cache-Control'] = cache_control.to_header()\n        return parse_cache_control_header(self.headers.get('cache-control'),\n                                          on_update,\n                                          ResponseCacheControl)\n\n    def make_conditional(self, request_or_environ):\n        \"\"\"Make the response conditional to the request.  This method works\n        best if an etag was defined for the response already.  The `add_etag`\n        method can be used to do that.  If called without etag just the date\n        header is set.\n\n        This does nothing if the request method in the request or environ is\n        anything but GET or HEAD.\n\n        It does not remove the body of the response because that's something\n        the :meth:`__call__` function does for us automatically.\n\n        Returns self so that you can do ``return resp.make_conditional(req)``\n        but modifies the object in-place.\n\n        :param request_or_environ: a request object or WSGI environment to be\n                                   used to make the response conditional\n                                   against.\n        \"\"\"\n        environ = _get_environ(request_or_environ)\n        if environ['REQUEST_METHOD'] in ('GET', 'HEAD'):\n            # if the date is not in the headers, add it now.  We however\n            # will not override an already existing header.  Unfortunately\n            # this header will be overriden by many WSGI servers including\n            # wsgiref.\n            if 'date' not in self.headers:\n                self.headers['Date'] = http_date()\n            if self.automatically_set_content_length and 'content-length' not in self.headers:\n                length = self.calculate_content_length()\n                if length is not None:\n                    self.headers['Content-Length'] = length\n            if not is_resource_modified(environ, self.headers.get('etag'), None,\n                                        self.headers.get('last-modified')):\n                self.status_code = 304\n        return self\n\n    def add_etag(self, overwrite=False, weak=False):\n        \"\"\"Add an etag for the current response if there is none yet.\"\"\"\n        if overwrite or 'etag' not in self.headers:\n            self.set_etag(generate_etag(self.get_data()), weak)\n\n    def set_etag(self, etag, weak=False):\n        \"\"\"Set the etag, and override the old one if there was one.\"\"\"\n        self.headers['ETag'] = quote_etag(etag, weak)\n\n    def get_etag(self):\n        \"\"\"Return a tuple in the form ``(etag, is_weak)``.  If there is no\n        ETag the return value is ``(None, None)``.\n        \"\"\"\n        return unquote_etag(self.headers.get('ETag'))\n\n    def freeze(self, no_etag=False):\n        \"\"\"Call this method if you want to make your response object ready for\n        pickeling.  This buffers the generator if there is one.  This also\n        sets the etag unless `no_etag` is set to `True`.\n        \"\"\"\n        if not no_etag:\n            self.add_etag()\n        super(ETagResponseMixin, self).freeze()\n\n    accept_ranges = header_property('Accept-Ranges', doc='''\n        The `Accept-Ranges` header.  Even though the name would indicate\n        that multiple values are supported, it must be one string token only.\n\n        The values ``'bytes'`` and ``'none'`` are common.\n\n        .. versionadded:: 0.7''')\n\n    def _get_content_range(self):\n        def on_update(rng):\n            if not rng:\n                del self.headers['content-range']\n            else:\n                self.headers['Content-Range'] = rng.to_header()\n        rv = parse_content_range_header(self.headers.get('content-range'),\n                                        on_update)\n        # always provide a content range object to make the descriptor\n        # more user friendly.  It provides an unset() method that can be\n        # used to remove the header quickly.\n        if rv is None:\n            rv = ContentRange(None, None, None, on_update=on_update)\n        return rv\n\n    def _set_content_range(self, value):\n        if not value:\n            del self.headers['content-range']\n        elif isinstance(value, string_types):\n            self.headers['Content-Range'] = value\n        else:\n            self.headers['Content-Range'] = value.to_header()\n    content_range = property(_get_content_range, _set_content_range, doc='''\n        The `Content-Range` header as\n        :class:`~werkzeug.datastructures.ContentRange` object.  Even if the\n        header is not set it wil provide such an object for easier\n        manipulation.\n\n        .. versionadded:: 0.7''')\n    del _get_content_range, _set_content_range\n\n\nclass ResponseStream(object):\n\n    \"\"\"A file descriptor like object used by the :class:`ResponseStreamMixin` to\n    represent the body of the stream.  It directly pushes into the response\n    iterable of the response object.\n    \"\"\"\n\n    mode = 'wb+'\n\n    def __init__(self, response):\n        self.response = response\n        self.closed = False\n\n    def write(self, value):\n        if self.closed:\n            raise ValueError('I/O operation on closed file')\n        self.response._ensure_sequence(mutable=True)\n        self.response.response.append(value)\n        self.response.headers.pop('Content-Length', None)\n\n    def writelines(self, seq):\n        for item in seq:\n            self.write(item)\n\n    def close(self):\n        self.closed = True\n\n    def flush(self):\n        if self.closed:\n            raise ValueError('I/O operation on closed file')\n\n    def isatty(self):\n        if self.closed:\n            raise ValueError('I/O operation on closed file')\n        return False\n\n    @property\n    def encoding(self):\n        return self.response.charset\n\n\nclass ResponseStreamMixin(object):\n\n    \"\"\"Mixin for :class:`BaseRequest` subclasses.  Classes that inherit from\n    this mixin will automatically get a :attr:`stream` property that provides\n    a write-only interface to the response iterable.\n    \"\"\"\n\n    @cached_property\n    def stream(self):\n        \"\"\"The response iterable as write-only stream.\"\"\"\n        return ResponseStream(self)\n\n\nclass CommonRequestDescriptorsMixin(object):\n\n    \"\"\"A mixin for :class:`BaseRequest` subclasses.  Request objects that\n    mix this class in will automatically get descriptors for a couple of\n    HTTP headers with automatic type conversion.\n\n    .. versionadded:: 0.5\n    \"\"\"\n\n    content_type = environ_property('CONTENT_TYPE', doc='''\n        The Content-Type entity-header field indicates the media type of\n        the entity-body sent to the recipient or, in the case of the HEAD\n        method, the media type that would have been sent had the request\n        been a GET.''')\n\n    @cached_property\n    def content_length(self):\n        \"\"\"The Content-Length entity-header field indicates the size of the\n        entity-body in bytes or, in the case of the HEAD method, the size of\n        the entity-body that would have been sent had the request been a\n        GET.\n        \"\"\"\n        return get_content_length(self.environ)\n\n    content_encoding = environ_property('HTTP_CONTENT_ENCODING', doc='''\n        The Content-Encoding entity-header field is used as a modifier to the\n        media-type.  When present, its value indicates what additional content\n        codings have been applied to the entity-body, and thus what decoding\n        mechanisms must be applied in order to obtain the media-type\n        referenced by the Content-Type header field.\n\n        .. versionadded:: 0.9''')\n    content_md5 = environ_property('HTTP_CONTENT_MD5', doc='''\n         The Content-MD5 entity-header field, as defined in RFC 1864, is an\n         MD5 digest of the entity-body for the purpose of providing an\n         end-to-end message integrity check (MIC) of the entity-body.  (Note:\n         a MIC is good for detecting accidental modification of the\n         entity-body in transit, but is not proof against malicious attacks.)\n\n        .. versionadded:: 0.9''')\n    referrer = environ_property('HTTP_REFERER', doc='''\n        The Referer[sic] request-header field allows the client to specify,\n        for the server's benefit, the address (URI) of the resource from which\n        the Request-URI was obtained (the \"referrer\", although the header\n        field is misspelled).''')\n    date = environ_property('HTTP_DATE', None, parse_date, doc='''\n        The Date general-header field represents the date and time at which\n        the message was originated, having the same semantics as orig-date\n        in RFC 822.''')\n    max_forwards = environ_property('HTTP_MAX_FORWARDS', None, int, doc='''\n         The Max-Forwards request-header field provides a mechanism with the\n         TRACE and OPTIONS methods to limit the number of proxies or gateways\n         that can forward the request to the next inbound server.''')\n\n    def _parse_content_type(self):\n        if not hasattr(self, '_parsed_content_type'):\n            self._parsed_content_type = \\\n                parse_options_header(self.environ.get('CONTENT_TYPE', ''))\n\n    @property\n    def mimetype(self):\n        \"\"\"Like :attr:`content_type`, but without parameters (eg, without\n        charset, type etc.) and always lowercase.  For example if the content\n        type is ``text/HTML; charset=utf-8`` the mimetype would be\n        ``'text/html'``.\n        \"\"\"\n        self._parse_content_type()\n        return self._parsed_content_type[0].lower()\n\n    @property\n    def mimetype_params(self):\n        \"\"\"The mimetype parameters as dict.  For example if the content\n        type is ``text/html; charset=utf-8`` the params would be\n        ``{'charset': 'utf-8'}``.\n        \"\"\"\n        self._parse_content_type()\n        return self._parsed_content_type[1]\n\n    @cached_property\n    def pragma(self):\n        \"\"\"The Pragma general-header field is used to include\n        implementation-specific directives that might apply to any recipient\n        along the request/response chain.  All pragma directives specify\n        optional behavior from the viewpoint of the protocol; however, some\n        systems MAY require that behavior be consistent with the directives.\n        \"\"\"\n        return parse_set_header(self.environ.get('HTTP_PRAGMA', ''))\n\n\nclass CommonResponseDescriptorsMixin(object):\n\n    \"\"\"A mixin for :class:`BaseResponse` subclasses.  Response objects that\n    mix this class in will automatically get descriptors for a couple of\n    HTTP headers with automatic type conversion.\n    \"\"\"\n\n    def _get_mimetype(self):\n        ct = self.headers.get('content-type')\n        if ct:\n            return ct.split(';')[0].strip()\n\n    def _set_mimetype(self, value):\n        self.headers['Content-Type'] = get_content_type(value, self.charset)\n\n    def _get_mimetype_params(self):\n        def on_update(d):\n            self.headers['Content-Type'] = \\\n                dump_options_header(self.mimetype, d)\n        d = parse_options_header(self.headers.get('content-type', ''))[1]\n        return CallbackDict(d, on_update)\n\n    mimetype = property(_get_mimetype, _set_mimetype, doc='''\n        The mimetype (content type without charset etc.)''')\n    mimetype_params = property(_get_mimetype_params, doc='''\n        The mimetype parameters as dict.  For example if the content\n        type is ``text/html; charset=utf-8`` the params would be\n        ``{'charset': 'utf-8'}``.\n\n        .. versionadded:: 0.5\n        ''')\n    location = header_property('Location', doc='''\n        The Location response-header field is used to redirect the recipient\n        to a location other than the Request-URI for completion of the request\n        or identification of a new resource.''')\n    age = header_property('Age', None, parse_date, http_date, doc='''\n        The Age response-header field conveys the sender's estimate of the\n        amount of time since the response (or its revalidation) was\n        generated at the origin server.\n\n        Age values are non-negative decimal integers, representing time in\n        seconds.''')\n    content_type = header_property('Content-Type', doc='''\n        The Content-Type entity-header field indicates the media type of the\n        entity-body sent to the recipient or, in the case of the HEAD method,\n        the media type that would have been sent had the request been a GET.\n    ''')\n    content_length = header_property('Content-Length', None, int, str, doc='''\n        The Content-Length entity-header field indicates the size of the\n        entity-body, in decimal number of OCTETs, sent to the recipient or,\n        in the case of the HEAD method, the size of the entity-body that would\n        have been sent had the request been a GET.''')\n    content_location = header_property('Content-Location', doc='''\n        The Content-Location entity-header field MAY be used to supply the\n        resource location for the entity enclosed in the message when that\n        entity is accessible from a location separate from the requested\n        resource's URI.''')\n    content_encoding = header_property('Content-Encoding', doc='''\n        The Content-Encoding entity-header field is used as a modifier to the\n        media-type.  When present, its value indicates what additional content\n        codings have been applied to the entity-body, and thus what decoding\n        mechanisms must be applied in order to obtain the media-type\n        referenced by the Content-Type header field.''')\n    content_md5 = header_property('Content-MD5', doc='''\n         The Content-MD5 entity-header field, as defined in RFC 1864, is an\n         MD5 digest of the entity-body for the purpose of providing an\n         end-to-end message integrity check (MIC) of the entity-body.  (Note:\n         a MIC is good for detecting accidental modification of the\n         entity-body in transit, but is not proof against malicious attacks.)\n        ''')\n    date = header_property('Date', None, parse_date, http_date, doc='''\n        The Date general-header field represents the date and time at which\n        the message was originated, having the same semantics as orig-date\n        in RFC 822.''')\n    expires = header_property('Expires', None, parse_date, http_date, doc='''\n        The Expires entity-header field gives the date/time after which the\n        response is considered stale. A stale cache entry may not normally be\n        returned by a cache.''')\n    last_modified = header_property('Last-Modified', None, parse_date,\n                                    http_date, doc='''\n        The Last-Modified entity-header field indicates the date and time at\n        which the origin server believes the variant was last modified.''')\n\n    def _get_retry_after(self):\n        value = self.headers.get('retry-after')\n        if value is None:\n            return\n        elif value.isdigit():\n            return datetime.utcnow() + timedelta(seconds=int(value))\n        return parse_date(value)\n\n    def _set_retry_after(self, value):\n        if value is None:\n            if 'retry-after' in self.headers:\n                del self.headers['retry-after']\n            return\n        elif isinstance(value, datetime):\n            value = http_date(value)\n        else:\n            value = str(value)\n        self.headers['Retry-After'] = value\n\n    retry_after = property(_get_retry_after, _set_retry_after, doc='''\n        The Retry-After response-header field can be used with a 503 (Service\n        Unavailable) response to indicate how long the service is expected\n        to be unavailable to the requesting client.\n\n        Time in seconds until expiration or date.''')\n\n    def _set_property(name, doc=None):\n        def fget(self):\n            def on_update(header_set):\n                if not header_set and name in self.headers:\n                    del self.headers[name]\n                elif header_set:\n                    self.headers[name] = header_set.to_header()\n            return parse_set_header(self.headers.get(name), on_update)\n\n        def fset(self, value):\n            if not value:\n                del self.headers[name]\n            elif isinstance(value, string_types):\n                self.headers[name] = value\n            else:\n                self.headers[name] = dump_header(value)\n        return property(fget, fset, doc=doc)\n\n    vary = _set_property('Vary', doc='''\n         The Vary field value indicates the set of request-header fields that\n         fully determines, while the response is fresh, whether a cache is\n         permitted to use the response to reply to a subsequent request\n         without revalidation.''')\n    content_language = _set_property('Content-Language', doc='''\n         The Content-Language entity-header field describes the natural\n         language(s) of the intended audience for the enclosed entity.  Note\n         that this might not be equivalent to all the languages used within\n         the entity-body.''')\n    allow = _set_property('Allow', doc='''\n        The Allow entity-header field lists the set of methods supported\n        by the resource identified by the Request-URI. The purpose of this\n        field is strictly to inform the recipient of valid methods\n        associated with the resource. An Allow header field MUST be\n        present in a 405 (Method Not Allowed) response.''')\n\n    del _set_property, _get_mimetype, _set_mimetype, _get_retry_after, \\\n        _set_retry_after\n\n\nclass WWWAuthenticateMixin(object):\n\n    \"\"\"Adds a :attr:`www_authenticate` property to a response object.\"\"\"\n\n    @property\n    def www_authenticate(self):\n        \"\"\"The `WWW-Authenticate` header in a parsed form.\"\"\"\n        def on_update(www_auth):\n            if not www_auth and 'www-authenticate' in self.headers:\n                del self.headers['www-authenticate']\n            elif www_auth:\n                self.headers['WWW-Authenticate'] = www_auth.to_header()\n        header = self.headers.get('www-authenticate')\n        return parse_www_authenticate_header(header, on_update)\n\n\nclass Request(BaseRequest, AcceptMixin, ETagRequestMixin,\n              UserAgentMixin, AuthorizationMixin,\n              CommonRequestDescriptorsMixin):\n\n    \"\"\"Full featured request object implementing the following mixins:\n\n    - :class:`AcceptMixin` for accept header parsing\n    - :class:`ETagRequestMixin` for etag and cache control handling\n    - :class:`UserAgentMixin` for user agent introspection\n    - :class:`AuthorizationMixin` for http auth handling\n    - :class:`CommonRequestDescriptorsMixin` for common headers\n    \"\"\"\n\n\nclass PlainRequest(StreamOnlyMixin, Request):\n\n    \"\"\"A request object without special form parsing capabilities.\n\n    .. versionadded:: 0.9\n    \"\"\"\n\n\nclass Response(BaseResponse, ETagResponseMixin, ResponseStreamMixin,\n               CommonResponseDescriptorsMixin,\n               WWWAuthenticateMixin):\n\n    \"\"\"Full featured response object implementing the following mixins:\n\n    - :class:`ETagResponseMixin` for etag and cache control handling\n    - :class:`ResponseStreamMixin` to add support for the `stream` property\n    - :class:`CommonResponseDescriptorsMixin` for various HTTP descriptors\n    - :class:`WWWAuthenticateMixin` for HTTP authentication support\n    \"\"\"\n"
  },
  {
    "path": "lib/werkzeug/wsgi.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\n    werkzeug.wsgi\n    ~~~~~~~~~~~~~\n\n    This module implements WSGI related helpers.\n\n    :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details.\n    :license: BSD, see LICENSE for more details.\n\"\"\"\nimport re\nimport os\nimport posixpath\nimport mimetypes\nfrom itertools import chain\nfrom zlib import adler32\nfrom time import time, mktime\nfrom datetime import datetime\nfrom functools import partial, update_wrapper\n\nfrom werkzeug._compat import iteritems, text_type, string_types, \\\n    implements_iterator, make_literal_wrapper, to_unicode, to_bytes, \\\n    wsgi_get_bytes, try_coerce_native, PY2\nfrom werkzeug._internal import _empty_stream, _encode_idna\nfrom werkzeug.http import is_resource_modified, http_date\nfrom werkzeug.urls import uri_to_iri, url_quote, url_parse, url_join\nfrom werkzeug.filesystem import get_filesystem_encoding\n\n\ndef responder(f):\n    \"\"\"Marks a function as responder.  Decorate a function with it and it\n    will automatically call the return value as WSGI application.\n\n    Example::\n\n        @responder\n        def application(environ, start_response):\n            return Response('Hello World!')\n    \"\"\"\n    return update_wrapper(lambda *a: f(*a)(*a[-2:]), f)\n\n\ndef get_current_url(environ, root_only=False, strip_querystring=False,\n                    host_only=False, trusted_hosts=None):\n    \"\"\"A handy helper function that recreates the full URL as IRI for the\n    current request or parts of it.  Here an example:\n\n    >>> from werkzeug.test import create_environ\n    >>> env = create_environ(\"/?param=foo\", \"http://localhost/script\")\n    >>> get_current_url(env)\n    'http://localhost/script/?param=foo'\n    >>> get_current_url(env, root_only=True)\n    'http://localhost/script/'\n    >>> get_current_url(env, host_only=True)\n    'http://localhost/'\n    >>> get_current_url(env, strip_querystring=True)\n    'http://localhost/script/'\n\n    This optionally it verifies that the host is in a list of trusted hosts.\n    If the host is not in there it will raise a\n    :exc:`~werkzeug.exceptions.SecurityError`.\n\n    Note that the string returned might contain unicode characters as the\n    representation is an IRI not an URI.  If you need an ASCII only\n    representation you can use the :func:`~werkzeug.urls.iri_to_uri`\n    function:\n\n    >>> from werkzeug.urls import iri_to_uri\n    >>> iri_to_uri(get_current_url(env))\n    'http://localhost/script/?param=foo'\n\n    :param environ: the WSGI environment to get the current URL from.\n    :param root_only: set `True` if you only want the root URL.\n    :param strip_querystring: set to `True` if you don't want the querystring.\n    :param host_only: set to `True` if the host URL should be returned.\n    :param trusted_hosts: a list of trusted hosts, see :func:`host_is_trusted`\n                          for more information.\n    \"\"\"\n    tmp = [environ['wsgi.url_scheme'], '://', get_host(environ, trusted_hosts)]\n    cat = tmp.append\n    if host_only:\n        return uri_to_iri(''.join(tmp) + '/')\n    cat(url_quote(wsgi_get_bytes(environ.get('SCRIPT_NAME', ''))).rstrip('/'))\n    cat('/')\n    if not root_only:\n        cat(url_quote(wsgi_get_bytes(environ.get('PATH_INFO', '')).lstrip(b'/')))\n        if not strip_querystring:\n            qs = get_query_string(environ)\n            if qs:\n                cat('?' + qs)\n    return uri_to_iri(''.join(tmp))\n\n\ndef host_is_trusted(hostname, trusted_list):\n    \"\"\"Checks if a host is trusted against a list.  This also takes care\n    of port normalization.\n\n    .. versionadded:: 0.9\n\n    :param hostname: the hostname to check\n    :param trusted_list: a list of hostnames to check against.  If a\n                         hostname starts with a dot it will match against\n                         all subdomains as well.\n    \"\"\"\n    if not hostname:\n        return False\n\n    if isinstance(trusted_list, string_types):\n        trusted_list = [trusted_list]\n\n    def _normalize(hostname):\n        if ':' in hostname:\n            hostname = hostname.rsplit(':', 1)[0]\n        return _encode_idna(hostname)\n\n    hostname = _normalize(hostname)\n    for ref in trusted_list:\n        if ref.startswith('.'):\n            ref = ref[1:]\n            suffix_match = True\n        else:\n            suffix_match = False\n        ref = _normalize(ref)\n        if ref == hostname:\n            return True\n        if suffix_match and hostname.endswith('.' + ref):\n            return True\n    return False\n\n\ndef get_host(environ, trusted_hosts=None):\n    \"\"\"Return the real host for the given WSGI environment.  This first checks\n    the `X-Forwarded-Host` header, then the normal `Host` header, and finally\n    the `SERVER_NAME` environment variable (using the first one it finds).\n\n    Optionally it verifies that the host is in a list of trusted hosts.\n    If the host is not in there it will raise a\n    :exc:`~werkzeug.exceptions.SecurityError`.\n\n    :param environ: the WSGI environment to get the host of.\n    :param trusted_hosts: a list of trusted hosts, see :func:`host_is_trusted`\n                          for more information.\n    \"\"\"\n    if 'HTTP_X_FORWARDED_HOST' in environ:\n        rv = environ['HTTP_X_FORWARDED_HOST'].split(',', 1)[0].strip()\n    elif 'HTTP_HOST' in environ:\n        rv = environ['HTTP_HOST']\n    else:\n        rv = environ['SERVER_NAME']\n        if (environ['wsgi.url_scheme'], environ['SERVER_PORT']) not \\\n           in (('https', '443'), ('http', '80')):\n            rv += ':' + environ['SERVER_PORT']\n    if trusted_hosts is not None:\n        if not host_is_trusted(rv, trusted_hosts):\n            from werkzeug.exceptions import SecurityError\n            raise SecurityError('Host \"%s\" is not trusted' % rv)\n    return rv\n\n\ndef get_content_length(environ):\n    \"\"\"Returns the content length from the WSGI environment as\n    integer.  If it's not available `None` is returned.\n\n    .. versionadded:: 0.9\n\n    :param environ: the WSGI environ to fetch the content length from.\n    \"\"\"\n    content_length = environ.get('CONTENT_LENGTH')\n    if content_length is not None:\n        try:\n            return max(0, int(content_length))\n        except (ValueError, TypeError):\n            pass\n\n\ndef get_input_stream(environ, safe_fallback=True):\n    \"\"\"Returns the input stream from the WSGI environment and wraps it\n    in the most sensible way possible.  The stream returned is not the\n    raw WSGI stream in most cases but one that is safe to read from\n    without taking into account the content length.\n\n    .. versionadded:: 0.9\n\n    :param environ: the WSGI environ to fetch the stream from.\n    :param safe: indicates whether the function should use an empty\n                 stream as safe fallback or just return the original\n                 WSGI input stream if it can't wrap it safely.  The\n                 default is to return an empty string in those cases.\n    \"\"\"\n    stream = environ['wsgi.input']\n    content_length = get_content_length(environ)\n\n    # A wsgi extension that tells us if the input is terminated.  In\n    # that case we return the stream unchanged as we know we can safely\n    # read it until the end.\n    if environ.get('wsgi.input_terminated'):\n        return stream\n\n    # If we don't have a content length we fall back to an empty stream\n    # in case of a safe fallback, otherwise we return the stream unchanged.\n    # The non-safe fallback is not recommended but might be useful in\n    # some situations.\n    if content_length is None:\n        return safe_fallback and _empty_stream or stream\n\n    # Otherwise limit the stream to the content length\n    return LimitedStream(stream, content_length)\n\n\ndef get_query_string(environ):\n    \"\"\"Returns the `QUERY_STRING` from the WSGI environment.  This also takes\n    care about the WSGI decoding dance on Python 3 environments as a\n    native string.  The string returned will be restricted to ASCII\n    characters.\n\n    .. versionadded:: 0.9\n\n    :param environ: the WSGI environment object to get the query string from.\n    \"\"\"\n    qs = wsgi_get_bytes(environ.get('QUERY_STRING', ''))\n    # QUERY_STRING really should be ascii safe but some browsers\n    # will send us some unicode stuff (I am looking at you IE).\n    # In that case we want to urllib quote it badly.\n    return try_coerce_native(url_quote(qs, safe=':&%=+$!*\\'(),'))\n\n\ndef get_path_info(environ, charset='utf-8', errors='replace'):\n    \"\"\"Returns the `PATH_INFO` from the WSGI environment and properly\n    decodes it.  This also takes care about the WSGI decoding dance\n    on Python 3 environments.  if the `charset` is set to `None` a\n    bytestring is returned.\n\n    .. versionadded:: 0.9\n\n    :param environ: the WSGI environment object to get the path from.\n    :param charset: the charset for the path info, or `None` if no\n                    decoding should be performed.\n    :param errors: the decoding error handling.\n    \"\"\"\n    path = wsgi_get_bytes(environ.get('PATH_INFO', ''))\n    return to_unicode(path, charset, errors, allow_none_charset=True)\n\n\ndef get_script_name(environ, charset='utf-8', errors='replace'):\n    \"\"\"Returns the `SCRIPT_NAME` from the WSGI environment and properly\n    decodes it.  This also takes care about the WSGI decoding dance\n    on Python 3 environments.  if the `charset` is set to `None` a\n    bytestring is returned.\n\n    .. versionadded:: 0.9\n\n    :param environ: the WSGI environment object to get the path from.\n    :param charset: the charset for the path, or `None` if no\n                    decoding should be performed.\n    :param errors: the decoding error handling.\n    \"\"\"\n    path = wsgi_get_bytes(environ.get('SCRIPT_NAME', ''))\n    return to_unicode(path, charset, errors, allow_none_charset=True)\n\n\ndef pop_path_info(environ, charset='utf-8', errors='replace'):\n    \"\"\"Removes and returns the next segment of `PATH_INFO`, pushing it onto\n    `SCRIPT_NAME`.  Returns `None` if there is nothing left on `PATH_INFO`.\n\n    If the `charset` is set to `None` a bytestring is returned.\n\n    If there are empty segments (``'/foo//bar``) these are ignored but\n    properly pushed to the `SCRIPT_NAME`:\n\n    >>> env = {'SCRIPT_NAME': '/foo', 'PATH_INFO': '/a/b'}\n    >>> pop_path_info(env)\n    'a'\n    >>> env['SCRIPT_NAME']\n    '/foo/a'\n    >>> pop_path_info(env)\n    'b'\n    >>> env['SCRIPT_NAME']\n    '/foo/a/b'\n\n    .. versionadded:: 0.5\n\n    .. versionchanged:: 0.9\n       The path is now decoded and a charset and encoding\n       parameter can be provided.\n\n    :param environ: the WSGI environment that is modified.\n    \"\"\"\n    path = environ.get('PATH_INFO')\n    if not path:\n        return None\n\n    script_name = environ.get('SCRIPT_NAME', '')\n\n    # shift multiple leading slashes over\n    old_path = path\n    path = path.lstrip('/')\n    if path != old_path:\n        script_name += '/' * (len(old_path) - len(path))\n\n    if '/' not in path:\n        environ['PATH_INFO'] = ''\n        environ['SCRIPT_NAME'] = script_name + path\n        rv = wsgi_get_bytes(path)\n    else:\n        segment, path = path.split('/', 1)\n        environ['PATH_INFO'] = '/' + path\n        environ['SCRIPT_NAME'] = script_name + segment\n        rv = wsgi_get_bytes(segment)\n\n    return to_unicode(rv, charset, errors, allow_none_charset=True)\n\n\ndef peek_path_info(environ, charset='utf-8', errors='replace'):\n    \"\"\"Returns the next segment on the `PATH_INFO` or `None` if there\n    is none.  Works like :func:`pop_path_info` without modifying the\n    environment:\n\n    >>> env = {'SCRIPT_NAME': '/foo', 'PATH_INFO': '/a/b'}\n    >>> peek_path_info(env)\n    'a'\n    >>> peek_path_info(env)\n    'a'\n\n    If the `charset` is set to `None` a bytestring is returned.\n\n    .. versionadded:: 0.5\n\n    .. versionchanged:: 0.9\n       The path is now decoded and a charset and encoding\n       parameter can be provided.\n\n    :param environ: the WSGI environment that is checked.\n    \"\"\"\n    segments = environ.get('PATH_INFO', '').lstrip('/').split('/', 1)\n    if segments:\n        return to_unicode(wsgi_get_bytes(segments[0]),\n                          charset, errors, allow_none_charset=True)\n\n\ndef extract_path_info(environ_or_baseurl, path_or_url, charset='utf-8',\n                      errors='replace', collapse_http_schemes=True):\n    \"\"\"Extracts the path info from the given URL (or WSGI environment) and\n    path.  The path info returned is a unicode string, not a bytestring\n    suitable for a WSGI environment.  The URLs might also be IRIs.\n\n    If the path info could not be determined, `None` is returned.\n\n    Some examples:\n\n    >>> extract_path_info('http://example.com/app', '/app/hello')\n    u'/hello'\n    >>> extract_path_info('http://example.com/app',\n    ...                   'https://example.com/app/hello')\n    u'/hello'\n    >>> extract_path_info('http://example.com/app',\n    ...                   'https://example.com/app/hello',\n    ...                   collapse_http_schemes=False) is None\n    True\n\n    Instead of providing a base URL you can also pass a WSGI environment.\n\n    .. versionadded:: 0.6\n\n    :param environ_or_baseurl: a WSGI environment dict, a base URL or\n                               base IRI.  This is the root of the\n                               application.\n    :param path_or_url: an absolute path from the server root, a\n                        relative path (in which case it's the path info)\n                        or a full URL.  Also accepts IRIs and unicode\n                        parameters.\n    :param charset: the charset for byte data in URLs\n    :param errors: the error handling on decode\n    :param collapse_http_schemes: if set to `False` the algorithm does\n                                  not assume that http and https on the\n                                  same server point to the same\n                                  resource.\n    \"\"\"\n    def _normalize_netloc(scheme, netloc):\n        parts = netloc.split(u'@', 1)[-1].split(u':', 1)\n        if len(parts) == 2:\n            netloc, port = parts\n            if (scheme == u'http' and port == u'80') or \\\n               (scheme == u'https' and port == u'443'):\n                port = None\n        else:\n            netloc = parts[0]\n            port = None\n        if port is not None:\n            netloc += u':' + port\n        return netloc\n\n    # make sure whatever we are working on is a IRI and parse it\n    path = uri_to_iri(path_or_url, charset, errors)\n    if isinstance(environ_or_baseurl, dict):\n        environ_or_baseurl = get_current_url(environ_or_baseurl,\n                                             root_only=True)\n    base_iri = uri_to_iri(environ_or_baseurl, charset, errors)\n    base_scheme, base_netloc, base_path = url_parse(base_iri)[:3]\n    cur_scheme, cur_netloc, cur_path, = \\\n        url_parse(url_join(base_iri, path))[:3]\n\n    # normalize the network location\n    base_netloc = _normalize_netloc(base_scheme, base_netloc)\n    cur_netloc = _normalize_netloc(cur_scheme, cur_netloc)\n\n    # is that IRI even on a known HTTP scheme?\n    if collapse_http_schemes:\n        for scheme in base_scheme, cur_scheme:\n            if scheme not in (u'http', u'https'):\n                return None\n    else:\n        if not (base_scheme in (u'http', u'https') and\n                base_scheme == cur_scheme):\n            return None\n\n    # are the netlocs compatible?\n    if base_netloc != cur_netloc:\n        return None\n\n    # are we below the application path?\n    base_path = base_path.rstrip(u'/')\n    if not cur_path.startswith(base_path):\n        return None\n\n    return u'/' + cur_path[len(base_path):].lstrip(u'/')\n\n\nclass SharedDataMiddleware(object):\n\n    \"\"\"A WSGI middleware that provides static content for development\n    environments or simple server setups. Usage is quite simple::\n\n        import os\n        from werkzeug.wsgi import SharedDataMiddleware\n\n        app = SharedDataMiddleware(app, {\n            '/shared': os.path.join(os.path.dirname(__file__), 'shared')\n        })\n\n    The contents of the folder ``./shared`` will now be available on\n    ``http://example.com/shared/``.  This is pretty useful during development\n    because a standalone media server is not required.  One can also mount\n    files on the root folder and still continue to use the application because\n    the shared data middleware forwards all unhandled requests to the\n    application, even if the requests are below one of the shared folders.\n\n    If `pkg_resources` is available you can also tell the middleware to serve\n    files from package data::\n\n        app = SharedDataMiddleware(app, {\n            '/shared': ('myapplication', 'shared_files')\n        })\n\n    This will then serve the ``shared_files`` folder in the `myapplication`\n    Python package.\n\n    The optional `disallow` parameter can be a list of :func:`~fnmatch.fnmatch`\n    rules for files that are not accessible from the web.  If `cache` is set to\n    `False` no caching headers are sent.\n\n    Currently the middleware does not support non ASCII filenames.  If the\n    encoding on the file system happens to be the encoding of the URI it may\n    work but this could also be by accident.  We strongly suggest using ASCII\n    only file names for static files.\n\n    The middleware will guess the mimetype using the Python `mimetype`\n    module.  If it's unable to figure out the charset it will fall back\n    to `fallback_mimetype`.\n\n    .. versionchanged:: 0.5\n       The cache timeout is configurable now.\n\n    .. versionadded:: 0.6\n       The `fallback_mimetype` parameter was added.\n\n    :param app: the application to wrap.  If you don't want to wrap an\n                application you can pass it :exc:`NotFound`.\n    :param exports: a dict of exported files and folders.\n    :param disallow: a list of :func:`~fnmatch.fnmatch` rules.\n    :param fallback_mimetype: the fallback mimetype for unknown files.\n    :param cache: enable or disable caching headers.\n    :param cache_timeout: the cache timeout in seconds for the headers.\n    \"\"\"\n\n    def __init__(self, app, exports, disallow=None, cache=True,\n                 cache_timeout=60 * 60 * 12, fallback_mimetype='text/plain'):\n        self.app = app\n        self.exports = {}\n        self.cache = cache\n        self.cache_timeout = cache_timeout\n        for key, value in iteritems(exports):\n            if isinstance(value, tuple):\n                loader = self.get_package_loader(*value)\n            elif isinstance(value, string_types):\n                if os.path.isfile(value):\n                    loader = self.get_file_loader(value)\n                else:\n                    loader = self.get_directory_loader(value)\n            else:\n                raise TypeError('unknown def %r' % value)\n            self.exports[key] = loader\n        if disallow is not None:\n            from fnmatch import fnmatch\n            self.is_allowed = lambda x: not fnmatch(x, disallow)\n        self.fallback_mimetype = fallback_mimetype\n\n    def is_allowed(self, filename):\n        \"\"\"Subclasses can override this method to disallow the access to\n        certain files.  However by providing `disallow` in the constructor\n        this method is overwritten.\n        \"\"\"\n        return True\n\n    def _opener(self, filename):\n        return lambda: (\n            open(filename, 'rb'),\n            datetime.utcfromtimestamp(os.path.getmtime(filename)),\n            int(os.path.getsize(filename))\n        )\n\n    def get_file_loader(self, filename):\n        return lambda x: (os.path.basename(filename), self._opener(filename))\n\n    def get_package_loader(self, package, package_path):\n        from pkg_resources import DefaultProvider, ResourceManager, \\\n            get_provider\n        loadtime = datetime.utcnow()\n        provider = get_provider(package)\n        manager = ResourceManager()\n        filesystem_bound = isinstance(provider, DefaultProvider)\n\n        def loader(path):\n            if path is None:\n                return None, None\n            path = posixpath.join(package_path, path)\n            if not provider.has_resource(path):\n                return None, None\n            basename = posixpath.basename(path)\n            if filesystem_bound:\n                return basename, self._opener(\n                    provider.get_resource_filename(manager, path))\n            return basename, lambda: (\n                provider.get_resource_stream(manager, path),\n                loadtime,\n                0\n            )\n        return loader\n\n    def get_directory_loader(self, directory):\n        def loader(path):\n            if path is not None:\n                path = os.path.join(directory, path)\n            else:\n                path = directory\n            if os.path.isfile(path):\n                return os.path.basename(path), self._opener(path)\n            return None, None\n        return loader\n\n    def generate_etag(self, mtime, file_size, real_filename):\n        if not isinstance(real_filename, bytes):\n            real_filename = real_filename.encode(get_filesystem_encoding())\n        return 'wzsdm-%d-%s-%s' % (\n            mktime(mtime.timetuple()),\n            file_size,\n            adler32(real_filename) & 0xffffffff\n        )\n\n    def __call__(self, environ, start_response):\n        cleaned_path = get_path_info(environ)\n        if PY2:\n            cleaned_path = cleaned_path.encode(get_filesystem_encoding())\n        # sanitize the path for non unix systems\n        cleaned_path = cleaned_path.strip('/')\n        for sep in os.sep, os.altsep:\n            if sep and sep != '/':\n                cleaned_path = cleaned_path.replace(sep, '/')\n        path = '/' + '/'.join(x for x in cleaned_path.split('/')\n                              if x and x != '..')\n        file_loader = None\n        for search_path, loader in iteritems(self.exports):\n            if search_path == path:\n                real_filename, file_loader = loader(None)\n                if file_loader is not None:\n                    break\n            if not search_path.endswith('/'):\n                search_path += '/'\n            if path.startswith(search_path):\n                real_filename, file_loader = loader(path[len(search_path):])\n                if file_loader is not None:\n                    break\n        if file_loader is None or not self.is_allowed(real_filename):\n            return self.app(environ, start_response)\n\n        guessed_type = mimetypes.guess_type(real_filename)\n        mime_type = guessed_type[0] or self.fallback_mimetype\n        f, mtime, file_size = file_loader()\n\n        headers = [('Date', http_date())]\n        if self.cache:\n            timeout = self.cache_timeout\n            etag = self.generate_etag(mtime, file_size, real_filename)\n            headers += [\n                ('Etag', '\"%s\"' % etag),\n                ('Cache-Control', 'max-age=%d, public' % timeout)\n            ]\n            if not is_resource_modified(environ, etag, last_modified=mtime):\n                f.close()\n                start_response('304 Not Modified', headers)\n                return []\n            headers.append(('Expires', http_date(time() + timeout)))\n        else:\n            headers.append(('Cache-Control', 'public'))\n\n        headers.extend((\n            ('Content-Type', mime_type),\n            ('Content-Length', str(file_size)),\n            ('Last-Modified', http_date(mtime))\n        ))\n        start_response('200 OK', headers)\n        return wrap_file(environ, f)\n\n\nclass DispatcherMiddleware(object):\n\n    \"\"\"Allows one to mount middlewares or applications in a WSGI application.\n    This is useful if you want to combine multiple WSGI applications::\n\n        app = DispatcherMiddleware(app, {\n            '/app2':        app2,\n            '/app3':        app3\n        })\n    \"\"\"\n\n    def __init__(self, app, mounts=None):\n        self.app = app\n        self.mounts = mounts or {}\n\n    def __call__(self, environ, start_response):\n        script = environ.get('PATH_INFO', '')\n        path_info = ''\n        while '/' in script:\n            if script in self.mounts:\n                app = self.mounts[script]\n                break\n            script, last_item = script.rsplit('/', 1)\n            path_info = '/%s%s' % (last_item, path_info)\n        else:\n            app = self.mounts.get(script, self.app)\n        original_script_name = environ.get('SCRIPT_NAME', '')\n        environ['SCRIPT_NAME'] = original_script_name + script\n        environ['PATH_INFO'] = path_info\n        return app(environ, start_response)\n\n\n@implements_iterator\nclass ClosingIterator(object):\n\n    \"\"\"The WSGI specification requires that all middlewares and gateways\n    respect the `close` callback of an iterator.  Because it is useful to add\n    another close action to a returned iterator and adding a custom iterator\n    is a boring task this class can be used for that::\n\n        return ClosingIterator(app(environ, start_response), [cleanup_session,\n                                                              cleanup_locals])\n\n    If there is just one close function it can be passed instead of the list.\n\n    A closing iterator is not needed if the application uses response objects\n    and finishes the processing if the response is started::\n\n        try:\n            return response(environ, start_response)\n        finally:\n            cleanup_session()\n            cleanup_locals()\n    \"\"\"\n\n    def __init__(self, iterable, callbacks=None):\n        iterator = iter(iterable)\n        self._next = partial(next, iterator)\n        if callbacks is None:\n            callbacks = []\n        elif callable(callbacks):\n            callbacks = [callbacks]\n        else:\n            callbacks = list(callbacks)\n        iterable_close = getattr(iterator, 'close', None)\n        if iterable_close:\n            callbacks.insert(0, iterable_close)\n        self._callbacks = callbacks\n\n    def __iter__(self):\n        return self\n\n    def __next__(self):\n        return self._next()\n\n    def close(self):\n        for callback in self._callbacks:\n            callback()\n\n\ndef wrap_file(environ, file, buffer_size=8192):\n    \"\"\"Wraps a file.  This uses the WSGI server's file wrapper if available\n    or otherwise the generic :class:`FileWrapper`.\n\n    .. versionadded:: 0.5\n\n    If the file wrapper from the WSGI server is used it's important to not\n    iterate over it from inside the application but to pass it through\n    unchanged.  If you want to pass out a file wrapper inside a response\n    object you have to set :attr:`~BaseResponse.direct_passthrough` to `True`.\n\n    More information about file wrappers are available in :pep:`333`.\n\n    :param file: a :class:`file`-like object with a :meth:`~file.read` method.\n    :param buffer_size: number of bytes for one iteration.\n    \"\"\"\n    return environ.get('wsgi.file_wrapper', FileWrapper)(file, buffer_size)\n\n\n@implements_iterator\nclass FileWrapper(object):\n\n    \"\"\"This class can be used to convert a :class:`file`-like object into\n    an iterable.  It yields `buffer_size` blocks until the file is fully\n    read.\n\n    You should not use this class directly but rather use the\n    :func:`wrap_file` function that uses the WSGI server's file wrapper\n    support if it's available.\n\n    .. versionadded:: 0.5\n\n    If you're using this object together with a :class:`BaseResponse` you have\n    to use the `direct_passthrough` mode.\n\n    :param file: a :class:`file`-like object with a :meth:`~file.read` method.\n    :param buffer_size: number of bytes for one iteration.\n    \"\"\"\n\n    def __init__(self, file, buffer_size=8192):\n        self.file = file\n        self.buffer_size = buffer_size\n\n    def close(self):\n        if hasattr(self.file, 'close'):\n            self.file.close()\n\n    def __iter__(self):\n        return self\n\n    def __next__(self):\n        data = self.file.read(self.buffer_size)\n        if data:\n            return data\n        raise StopIteration()\n\n\ndef _make_chunk_iter(stream, limit, buffer_size):\n    \"\"\"Helper for the line and chunk iter functions.\"\"\"\n    if isinstance(stream, (bytes, bytearray, text_type)):\n        raise TypeError('Passed a string or byte object instead of '\n                        'true iterator or stream.')\n    if not hasattr(stream, 'read'):\n        for item in stream:\n            if item:\n                yield item\n        return\n    if not isinstance(stream, LimitedStream) and limit is not None:\n        stream = LimitedStream(stream, limit)\n    _read = stream.read\n    while 1:\n        item = _read(buffer_size)\n        if not item:\n            break\n        yield item\n\n\ndef make_line_iter(stream, limit=None, buffer_size=10 * 1024):\n    \"\"\"Safely iterates line-based over an input stream.  If the input stream\n    is not a :class:`LimitedStream` the `limit` parameter is mandatory.\n\n    This uses the stream's :meth:`~file.read` method internally as opposite\n    to the :meth:`~file.readline` method that is unsafe and can only be used\n    in violation of the WSGI specification.  The same problem applies to the\n    `__iter__` function of the input stream which calls :meth:`~file.readline`\n    without arguments.\n\n    If you need line-by-line processing it's strongly recommended to iterate\n    over the input stream using this helper function.\n\n    .. versionchanged:: 0.8\n       This function now ensures that the limit was reached.\n\n    .. versionadded:: 0.9\n       added support for iterators as input stream.\n\n    :param stream: the stream or iterate to iterate over.\n    :param limit: the limit in bytes for the stream.  (Usually\n                  content length.  Not necessary if the `stream`\n                  is a :class:`LimitedStream`.\n    :param buffer_size: The optional buffer size.\n    \"\"\"\n    _iter = _make_chunk_iter(stream, limit, buffer_size)\n\n    first_item = next(_iter, '')\n    if not first_item:\n        return\n\n    s = make_literal_wrapper(first_item)\n    empty = s('')\n    cr = s('\\r')\n    lf = s('\\n')\n    crlf = s('\\r\\n')\n\n    _iter = chain((first_item,), _iter)\n\n    def _iter_basic_lines():\n        _join = empty.join\n        buffer = []\n        while 1:\n            new_data = next(_iter, '')\n            if not new_data:\n                break\n            new_buf = []\n            for item in chain(buffer, new_data.splitlines(True)):\n                new_buf.append(item)\n                if item and item[-1:] in crlf:\n                    yield _join(new_buf)\n                    new_buf = []\n            buffer = new_buf\n        if buffer:\n            yield _join(buffer)\n\n    # This hackery is necessary to merge 'foo\\r' and '\\n' into one item\n    # of 'foo\\r\\n' if we were unlucky and we hit a chunk boundary.\n    previous = empty\n    for item in _iter_basic_lines():\n        if item == lf and previous[-1:] == cr:\n            previous += item\n            item = empty\n        if previous:\n            yield previous\n        previous = item\n    if previous:\n        yield previous\n\n\ndef make_chunk_iter(stream, separator, limit=None, buffer_size=10 * 1024):\n    \"\"\"Works like :func:`make_line_iter` but accepts a separator\n    which divides chunks.  If you want newline based processing\n    you should use :func:`make_line_iter` instead as it\n    supports arbitrary newline markers.\n\n    .. versionadded:: 0.8\n\n    .. versionadded:: 0.9\n       added support for iterators as input stream.\n\n    :param stream: the stream or iterate to iterate over.\n    :param separator: the separator that divides chunks.\n    :param limit: the limit in bytes for the stream.  (Usually\n                  content length.  Not necessary if the `stream`\n                  is otherwise already limited).\n    :param buffer_size: The optional buffer size.\n    \"\"\"\n    _iter = _make_chunk_iter(stream, limit, buffer_size)\n\n    first_item = next(_iter, '')\n    if not first_item:\n        return\n\n    _iter = chain((first_item,), _iter)\n    if isinstance(first_item, text_type):\n        separator = to_unicode(separator)\n        _split = re.compile(r'(%s)' % re.escape(separator)).split\n        _join = u''.join\n    else:\n        separator = to_bytes(separator)\n        _split = re.compile(b'(' + re.escape(separator) + b')').split\n        _join = b''.join\n\n    buffer = []\n    while 1:\n        new_data = next(_iter, '')\n        if not new_data:\n            break\n        chunks = _split(new_data)\n        new_buf = []\n        for item in chain(buffer, chunks):\n            if item == separator:\n                yield _join(new_buf)\n                new_buf = []\n            else:\n                new_buf.append(item)\n        buffer = new_buf\n    if buffer:\n        yield _join(buffer)\n\n\n@implements_iterator\nclass LimitedStream(object):\n\n    \"\"\"Wraps a stream so that it doesn't read more than n bytes.  If the\n    stream is exhausted and the caller tries to get more bytes from it\n    :func:`on_exhausted` is called which by default returns an empty\n    string.  The return value of that function is forwarded\n    to the reader function.  So if it returns an empty string\n    :meth:`read` will return an empty string as well.\n\n    The limit however must never be higher than what the stream can\n    output.  Otherwise :meth:`readlines` will try to read past the\n    limit.\n\n    .. admonition:: Note on WSGI compliance\n\n       calls to :meth:`readline` and :meth:`readlines` are not\n       WSGI compliant because it passes a size argument to the\n       readline methods.  Unfortunately the WSGI PEP is not safely\n       implementable without a size argument to :meth:`readline`\n       because there is no EOF marker in the stream.  As a result\n       of that the use of :meth:`readline` is discouraged.\n\n       For the same reason iterating over the :class:`LimitedStream`\n       is not portable.  It internally calls :meth:`readline`.\n\n       We strongly suggest using :meth:`read` only or using the\n       :func:`make_line_iter` which safely iterates line-based\n       over a WSGI input stream.\n\n    :param stream: the stream to wrap.\n    :param limit: the limit for the stream, must not be longer than\n                  what the string can provide if the stream does not\n                  end with `EOF` (like `wsgi.input`)\n    \"\"\"\n\n    def __init__(self, stream, limit):\n        self._read = stream.read\n        self._readline = stream.readline\n        self._pos = 0\n        self.limit = limit\n\n    def __iter__(self):\n        return self\n\n    @property\n    def is_exhausted(self):\n        \"\"\"If the stream is exhausted this attribute is `True`.\"\"\"\n        return self._pos >= self.limit\n\n    def on_exhausted(self):\n        \"\"\"This is called when the stream tries to read past the limit.\n        The return value of this function is returned from the reading\n        function.\n        \"\"\"\n        # Read null bytes from the stream so that we get the\n        # correct end of stream marker.\n        return self._read(0)\n\n    def on_disconnect(self):\n        \"\"\"What should happen if a disconnect is detected?  The return\n        value of this function is returned from read functions in case\n        the client went away.  By default a\n        :exc:`~werkzeug.exceptions.ClientDisconnected` exception is raised.\n        \"\"\"\n        from werkzeug.exceptions import ClientDisconnected\n        raise ClientDisconnected()\n\n    def exhaust(self, chunk_size=1024 * 64):\n        \"\"\"Exhaust the stream.  This consumes all the data left until the\n        limit is reached.\n\n        :param chunk_size: the size for a chunk.  It will read the chunk\n                           until the stream is exhausted and throw away\n                           the results.\n        \"\"\"\n        to_read = self.limit - self._pos\n        chunk = chunk_size\n        while to_read > 0:\n            chunk = min(to_read, chunk)\n            self.read(chunk)\n            to_read -= chunk\n\n    def read(self, size=None):\n        \"\"\"Read `size` bytes or if size is not provided everything is read.\n\n        :param size: the number of bytes read.\n        \"\"\"\n        if self._pos >= self.limit:\n            return self.on_exhausted()\n        if size is None or size == -1:  # -1 is for consistence with file\n            size = self.limit\n        to_read = min(self.limit - self._pos, size)\n        try:\n            read = self._read(to_read)\n        except (IOError, ValueError):\n            return self.on_disconnect()\n        if to_read and len(read) != to_read:\n            return self.on_disconnect()\n        self._pos += len(read)\n        return read\n\n    def readline(self, size=None):\n        \"\"\"Reads one line from the stream.\"\"\"\n        if self._pos >= self.limit:\n            return self.on_exhausted()\n        if size is None:\n            size = self.limit - self._pos\n        else:\n            size = min(size, self.limit - self._pos)\n        try:\n            line = self._readline(size)\n        except (ValueError, IOError):\n            return self.on_disconnect()\n        if size and not line:\n            return self.on_disconnect()\n        self._pos += len(line)\n        return line\n\n    def readlines(self, size=None):\n        \"\"\"Reads a file into a list of strings.  It calls :meth:`readline`\n        until the file is read to the end.  It does support the optional\n        `size` argument if the underlaying stream supports it for\n        `readline`.\n        \"\"\"\n        last_pos = self._pos\n        result = []\n        if size is not None:\n            end = min(self.limit, last_pos + size)\n        else:\n            end = self.limit\n        while 1:\n            if size is not None:\n                size -= last_pos - self._pos\n            if self._pos >= end:\n                break\n            result.append(self.readline(size))\n            if size is not None:\n                last_pos = self._pos\n        return result\n\n    def tell(self):\n        \"\"\"Returns the position of the stream.\n\n        .. versionadded:: 0.9\n        \"\"\"\n        return self._pos\n\n    def __next__(self):\n        line = self.readline()\n        if not line:\n            raise StopIteration()\n        return line\n"
  },
  {
    "path": "main.py",
    "content": "\"\"\"`main` is the top level module for your Flask application.\"\"\"\n\n# Import the Flask Framework\nfrom flask import Flask\napp = Flask(__name__)\n# Note: We don't need to call run() since our application is embedded within\n# the App Engine WSGI application server.\n\n\n@app.route('/')\ndef hello():\n    \"\"\"Return a friendly HTTP greeting.\"\"\"\n    return 'Hello World!'\n\n\n@app.errorhandler(404)\ndef page_not_found(e):\n    \"\"\"Return a custom 404 error.\"\"\"\n    return 'Sorry, Nothing at this URL.', 404\n\n\n@app.errorhandler(500)\ndef application_error(e):\n    \"\"\"Return a custom 500 error.\"\"\"\n    return 'Sorry, unexpected error: {}'.format(e), 500\n"
  },
  {
    "path": "requirements.txt",
    "content": "# This requirements file lists all third-party dependencies for this project.\n#\n# Run 'pip install -r requirements.txt -t lib/' to install these dependencies\n# in `lib/` subdirectory.\n#\n# Note: The `lib` directory is added to `sys.path` by `appengine_config.py`.\nFlask==0.10\n"
  }
]